自定义标签:用于移除Jsp页面中的java代码。
完成自定义标签的步骤:
JSP文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.itcast.cn" prefix="itcast"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '1.jsp' starting page</title>
</head>
<body>
您的IP是:<itcast:viewIP/>
</body>
</html>
1、 编写一个实现Tag接口的Java类,把页面java代码移到这个java类中(标签处理器类)------一般实现TagSupport
publicclass ViewIPTag extends TagSupport{
@Override
publicint doStartTag() throws JspException {
HttpServletRequest request=(HttpServletRequest) this.pageContext.getRequest();
JspWriter out=this.pageContext.getOut();
String ip=request.getRemoteAddr();
try {
out.print(ip);
} catch (IOException e) {
thrownew RuntimeException(e);
}
returnsuper.doStartTag();
}
}
2、 编写标签库描述符(tld)文件,在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>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name>
<uri>http://www.itcast.cn</uri>
<tag>
<name>viewIP</name>
<tag-class>cn.itcast.web.tag.ViewIPTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
Tag接口的执行流程:
1、 public void setPageContext(PageContext pc),JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pagContext对象与JSP页面进行通信
2、 public void setParent(Tag t),如果当前标签没有父标签,则传递给setParent 方法的参数值为null
3、 public int doStartTag(),web容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法
4、 public int doEndTag(),web容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,web容器就会调用标签处理器的doEndTag方法
5、 public void release(),通常web容器执行完自定义标签后,标签处理器会驻留在内存中,为其他请求服务器,直至停止web应用时,web容器才会调用release方法。
自定义标签功能扩展:
1、 控制JSP页面某一部分内容是否执行;à改变doStartTag( )的返回值(Tag.EVAL_BODY_INCLUDE和SKIP_BODY)
2、 控制整个JSP页面是否执行à改变doEndTag( )的返回值(Tag.SKIP_PAGE和Tag.EVAL_PAGE)
3、 控制JSP页面重复执行[IterationTagàdoAfterBody( )à标签体之后,结束标签执行之前执行àEVAL_BODY_AGAIN、SKIP_BODY]--à继承TagSupport,先覆盖doStartTag( ),设置为EVAL_BODY_INCLUDE,让标签体执行,然后doAfterBody();
4、 修改JSP页面内容输出[继承BodyTagSupport]
(1)、先覆盖doStartTag(),返回BodyTag.EVAL_BODY_BUFFEREDà将标签体内容作为对象返回
(2)、覆盖doEndTag(),
publicint doEndTag() throws JspException {
BodyContent bc=this.getBodyContent();
String content=bc.getString();
content=content.toUpperCase();
try {
this.pageContext.getOut().write(content);
} catch (IOException e) {
thrownew RuntimeException(e);
}
return Tag.EVAL_PAGE;
}
}
SimpleTag(简单标签)
JspFragment jf=this.getJspBody( );
控制整个Jsp不执行:Throw new SkipPageException;
简单标签的执行流程:
1、 遇到简单标签;
2、 实例化标签处理器类;
3、 调用setJspContext( ),把页面pageContext传递给标签处理器类;
4、 调用setParent把父标签传递进去,如果没有父亲,传null;
5、 调用setJspBody(),把封装了标签体JspFragment传递给标签处理器类;
6、 执行页面中的自定义标签,执行标签实际上就是调用doTag()。
开发带属性的标签:
1、 在标签处理器中编写每个属性对应的setter方法
2、 在tld文件中描述标签的属性;