JSP自定义标签简单入门教程

在sun官方文档上有下面这样一段话。

官方文档声明

public interface SimpleTag
extends JspTag
Interface for defining Simple Tag Handlers.
Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface provides a simple doTag() method, which is called once and only once for any given tag invocation. All tag logic, iteration, body evaluations, etc. are to be performed in this single method. Thus, simple tag handlers have the equivalent power of BodyTag, but with a much simpler lifecycle and interface.

To support body content, the setJspBody() method is provided. The container invokes the setJspBody() method with a JspFragment object encapsulating the body of the tag. The tag handler implementation can call invoke() on that fragment to evaluate the body as many times as it needs.

A SimpleTag handler must have a public no-args constructor. Most SimpleTag handlers should extend SimpleTagSupport.

生存周期及调用流程

The following is a non-normative, brief overview of the SimpleTag lifecycle. Refer to the JSP Specification for details.

A new tag handler instance is created each time by the container by calling the provided zero-args constructor. Unlike classic tag handlers, simple tag handlers are never cached and reused by the JSP container.
The setJspContext() and setParent() methods are called by the container. The setParent() method is only called if the element is nested within another tag invocation.
The setters for each attribute defined for this tag are called by the container.
If a body exists, the setJspBody() method is called by the container to set the body of this tag, as a JspFragment. If the action element is empty in the page, this method is not called at all.
The doTag() method is called by the container. All tag logic, iteration, body evaluations, etc. occur in this method.
The doTag() method returns and all variables are synchronized.

简单标签使用小案例

必知必会:简单标签也是一个标签,所以声明的过程也Tag的一样,同样是三步。

1、建继承SimpleTag类的实现类,重写doTag方法
2、tld文件中进行严格的声明
3、jsp页面中taglib的命名空间及标签前缀的声明,然后进行调用自定义的简单标签

第一步:创建实现类:

package web.simpletag;
import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 控制标签体是否执行
 * @author Summer
 *
 */
public class BodyController extends SimpleTagSupport {
  static{
    /*
     * 简单标签整体的执行流程如下:
     * 1.浏览器向web服务器发送请求,然后web服务器调用servlet(jsp)
     * 2.complier解释器进行初始化工作,先是调用setJspContext方法,将pageContext对象传递进去
     * 3.然后是看看此标签的父标签,即setParent方法
     * 4.再就是调用doTag方法了吧?但是要知道doTag内部会使用JspFragment对象,所以就必须先得到它,因此应该是调用setJspBody(JspFragment jspBody)方法
     * 5.最后是调用doTag 方法,执行相关的代码逻辑
     */
  }

  /**
   * 简单标签可以使用这一个方法实现所有的业务逻辑
   */
  @Override
  public void doTag() throws JspException, IOException {
    //代表标签体的对象
    JspFragment fragment = this.getJspBody();
    //fragment.invoke(null);是指将标签中的内容写给谁,null代表浏览器

    //1.修改标签体的内容
//   fragment.invoke(null);

    //2.控制标签体内容的重复输出
//   for(int i=1;i<=5;i++){
//     fragment.invoke(null);//设置为null,默认为向浏览器输出
//   }

    //3.修改标签体的内容
    PageContext context = (PageContext) fragment.getJspContext();
    StringWriter writer = new StringWriter();
    fragment.invoke(writer);
    String content = writer.getBuffer().toString();

    this.getJspContext().getOut().write(content.toUpperCase());

    //4.控制jsp页面的执行与否,只需要掌握一个原理即可
    /*
     * SkipPageException - If the page that (either directly or indirectly) invoked this
     * tag is to cease evaluation. A Simple Tag Handler generated from a tag
     * file must throw this exception if an invoked Classic Tag Handler
     *  returned SKIP_PAGE or if an invoked Simple Tag Handler threw
     *  SkipPageException or if an invoked Jsp Fragment threw a
     *  SkipPageException.
     */
//   throw new SkipPageException();
  }

}

在tld文件中进行相关约束项的配置:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">

  <description>JSTL 1.1 XML library</description>
  <display-name>JSTL XML</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>x</short-name>
  <uri>/simplesummer</uri>

  <!-- 控制标签体内容的的简单标签的自定义标签 -->
  <tag>
    <name>BodyController</name>
    <tag-class>web.simpletag.BodyController</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

第三步:在jsp页面中进行声明然后调用:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@taglib uri="/simplesummer" prefix="summer"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用SimpleTag接口实现的控制标签体内容是否执行的测试页面</title>
</head>
<body>
  <summer:BodyController>Summer</summer:BodyController>

</body>
</html>

总结:
简单标签可以替代BodyTag接口完成同样的操作,但是有更加的简单和轻便
简单标签lifeCycle逻辑清晰,调用规则明确
使用相关流对象就可以完成对标签体的操控maniplate

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • JSP页面中如何用select标签实现级联

    做查询页面,查询条件比较多的时候往往会涉及到级联.举个简单的例子,拿教务系统来说,我们要查询教学计划信息,查询条件是入学批次.学生层次(专升本.高升专).专业.课程. 它们之间有什么级联关系呢?入学批次影响学生层次(某个入学批次可能只有专升本或者高升专一个学生层次).专业.课程,学生层次影响专业.课程,专业又影响课程.也就是说当选择入学批次时,学生层次.专业和课程的下拉框会局部刷新,选择学生层次时,专业和课程的下拉框会局部刷新,选择专业时,课程的下拉框也会局部刷新. 我们当然不希望已经选择的操作

  • jsp base标签与meta标签学习小结

    复制代码 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!-- 定义jsp的编码,还有引入的java文件 --> <% String path = request.getContextPath(); //得到当前的项目名字. String basePath = request.getScheme()+"

  • jsp简单自定义标签的forEach遍历及转义字符示例

    接着昨天的,如果<forEach>中的items类型是map或者Collection类型的,怎样使用增强for循环: 首先还是创建一个标签处理器类,定义两个属性,String var; Object items: 因为items要迭代各种集合,所以要使用Object; 然后重写setter方法: 声明一个成员变量,集合类型的, 和上面两个属性是不相同的,这个是用在类里的, 在items的setter方法中,判断items的类型 然后继承他的doTag方法: 复制代码 代码如下: public

  • jsp struts1 标签实例详解第1/2页

    1,TagForm.java 复制代码 代码如下: package com.tarena.struts.tag.form; import org.apache.struts.action.*; import javax.servlet.http.*; import java.util.*; public class TagForm extends ActionForm { private int id; private String userName; private String passwo

  • JSP自定义标签获取用户IP地址的方法

    1.编写一个实现tag接口的标签处理器类 复制代码 代码如下: package cn.itcast.web.tag; import java.io.IOException; import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.PageContext;import j

  • JSP自定义分页标签TAG全过程

    首先我们需要在WEB-INF/tld/目录下创建page.tld文件 <?xml version="1.0" encoding="ISO-8859-1"?> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>page</short-name> <u

  • jsp自定义标签技术(实现原理与代码以及平台搭建步骤)

    由于jsp代码规范要求不能出现一句java代码.所有就有了jsp 的自定义标签技术. 所以jsp的自定义标签技术就是除去jsp的中的java代码.同时封装标签个人感觉也是一种安全性的体现,不让别人知道实现内部的代码. 那个如何实现自定义标签技术呢? 第一你得搭建一个环境,apche公司给了两个jar包分别是jstl.Jar和standar.Jar.将他们导入到javaweb工程下wed-inf的lib目录下面.(这两个jar包网上很多,也可上官网直接下载) 环境构建完毕.下面我用一段代码来制作一

  • JSP自定义标签Taglib实现过程重点总结

    Taglib指令介绍 Taglib指令,其实就是定义一个标签库以及自定义标签的前缀. 比如struts中支持的标签库,html标签库.bean标签库.logic标签库. 其中的具体的实现方式,我们不过多介绍,我们给大家从宏观的角度以及解决其中的疑难点,后面会大家介绍相应的学习资料. 除了struts的标签库,我们常见还有jstl标签库. 这样在界面jsp中引入其中的标签库或者标签库文件,然后才可以正常使用其中定义的标签. 复制代码 代码如下: <%@ taglib prefix ="bea

  • jsp页面中如何将时间戳字符串格式化为时间标签

    datetag.tld文件: <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <tagli

  • jsp 常用标签的使用

    jsp中定义实体bean<jsp:useBean id="clu" class="cn.domain.CacluBean"></jsp:useBean><jsp:getProperty property="propertyname" name = "clu">获取bean的属性值,并将值输出到页面上: EL表达式:${实体对象名称}el表达式取数据时,通常用.号,.号取不出来就用[] pag

随机推荐