一、自定义标签简介
自定义标签主要用于移除Jsp页面中的<%java%>代码。
实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法。
二、SimpleTag方法介绍
setJspContext方法 用于把JSP页面的pageContext对象传递给标签处理器对象
setParent方法 用于把父标签处理器对象传递给当前标签处理器对象
getParent方法 用于获得当前标签的父标签处理器对象
setJspBody方法 用于把代表标签体的JspFragment对象(即标签体内容)传递给标签处理器对象
doTag方法 用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容。
三、SimpleTag接口方法的执行顺序
WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。
WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法。
如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。
如果简单标签有标签体,容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来。
四、JspFragment类
javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素,即<%%>。
WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:
getJspContext方法 用于返回代表调用页面的JspContext对象.
public abstract void invoke(java.io.Writer out) 用于执行JspFragment对象所代表的JSP代码片段参数,out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)。
五、在TLD中描述标签属性
六、自定义标签的开发步骤
1.写一个标签处理类
//标签处理类
public class IpTag implements SimpleTag { //or extend SimpleTagSupport
private PageContext pageContext;
//Web容器调用NO1
public void setJspContext(JspContext pc) {
System.out.println("setJspContext()");
pageContext = (PageContext) pc;
}
//Web容器调用NO2
public void doTag() throws JspException, IOException {
System.out.println("doTag()");
//取得HttpServletRequest请求对象
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
//取得客户端的IP地址
String ip = request.getRemoteAddr();
//取得out(JspWriter)对象
JspWriter out = pageContext.getOut();
//向浏览器输出
out.write("<font size='44' color='red'>"+ip+"</font>");
}
...
}
2.在/WEB-INF/目录下,写一个*.tld文件,目的是让Web容器知道自定义标签和标签处理类的对应关系
<?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">
<tlib-version>1.0</tlib-version>
<short-name>simple</short-name> //前缀
<uri>http://java.sun.com/jsp/jstl/simple</uri>
<tag>
<name>ip</name>//标签名
<tag-class>cn.itcast.web.jsp.tag.IpTag</tag-class>
<body-content>empty/scriptless</body-content>
</tag>
<attribute>
<name>XXX</name>
<required>true/false</required>
<rtexprvalue>true/false</rtexprvalue>
</attribute>
</taglib>
3.在JSP页面中,通过<%@taglib%>指令引用标签库
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/simple" prefix="simple" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
客户端IP为:<simple:ip/>
</body>
</html>
4.
部署web应用,访问simple.jsp即可