一 简介
主要用于移除jsp页面中的java代码
- 编写一个实现Tag接口的Java类,为避免需要实现不必要的方法,只需继承TagSupport类,
把页面java代码移到这个标签处理类中, - 然后编写标签库描述符文件:*.tld
- 在jsp页面导入标签库即可使用
二 原理
1. JSP的执行过程主要可以分为以下几点:
1 客户端发出请求。 |
2 Web容器将JSP转译成Servlet源代码。 |
3 Web容器将产生的源代码进行编译。 |
4 Web容器加载编译后的代码并执行。 |
5 把执行结果响应至客户端 |
2. 没有标签时:
JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,
JSP脚本片断(位于<%%>内的 一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,
JSP表达式(位于<%=和%>之中的内容)则是被转换成以其 中的变量或表达式作为参数的out.print语句。
3. 加入标签库:
- 根据tld文件找到对应的标签处理类;
- doStartTag() -> 显示本体文字 -> doAfterBodyTag()->doEndTag()->执行接下来的JSP网页
- ---------------------------------------------
-
-
- 当JSP容器在解释JSP页面时,如果遇到自定义标签,将利用标签处理类建立一个标签处理对象。于此同时,JSP容器自动调用setPageContext()方法,将自定义标签的属性值存入标签处理对象,初始化标签处理对象
- JSP容器运行doStartTag()方法,根据该方法返回值决定后续动作。
- 如果返回SKIP_BODY常量,JSP容器忽略该标签主题内容,运行doEndTag()方法
- 若返回EVAL_BODY_INCLUDE常量,JSP容器执行标签主体内容,并将结果包括在响应中,然后运行doAfterBody()方法
- 返回EVAL_BODY_AGAIN常量,JSP容器会再次执行标签体内容
-
若doEndTag()方法返回EVAL_PAGE常量,JSP容器运行自定义标签后面的JSP内容;若返回SKIP_PAGE常量
JSP容器忽略自定义标签后面的JSP内容
-
4. 类之间的关系:
-
三 步骤
- 编写HelloWorldTag.java
package com.tag; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HelloWorldTag extends TagSupport { private static final long serialVersionUID = 1L; private String name; public void setName(String name) { this.name = name; } @Override public int doStartTag() throws JspException { JspWriter out = this.pageContext.getOut(); HttpServletRequest hreq = (HttpServletRequest) this.pageContext.getRequest(); try { out.print("Hello-World-"+name+"<br/>"); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } return super.doStartTag(); } }
- 标签库描述符文件
<?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>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>http://self-tag-with-hello</uri> <tag> <name>helloWorld</name> <tag-class>com.tag.HelloWorldTag</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
- jsp页面显示
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://self-tag-with-hello" prefix="i" %> <html> <head> <title>helllo</title> </head> <body> <i:helloWorld name="小呵"/> </body> </html>
- 结果