1、编写一个实现tag接口的实现类
public class ViewIpTag extends TagSupport {
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
JspWriter out = this.pageContext.getOut();
String ip = request.getRemoteAddr();
try {
out.write("ip : " + ip);
} catch (IOException e) { /*此标签由viewIp2.jsp调用,如出问题,需要通知其调用者,所以转成一个Java运行时异常抛出,以通知其调用者*/
throw new RuntimeException(e);
}
return super.doStartTag();
}
}
2、在tld文件中对标签处理器类进行描述(放在WEB-INF目录下)
<?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>There are my custom tags.</description>
<tlib-version>1.0</tlib-version>
<short-name>Class3g</short-name>
<uri>http://www.class3g.com</uri>
<tag>
<description>show the romete address</description>
<name>viewIP</name>
<tag-class>class3g.web.tag.ViewIpTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
<taglib>元素是标签库描述符的根元素,它包含12个子元素,现在只简单介绍几个
<description>:标签库的一个文本描述。
<tlib-version>:指定标签库的版本。
<short-name>: 为标签定义简短的名字,在taglib指令中可作为首选的前缀名使用。
<uri>:定义一个URI,用于唯一的标识此标签库。
<tag>:用于指定自定义标签的相关信息。<tag>元素有12个子元素,这里只对部分元素做介绍,如下。
1) <description>:为自定义标签提供一个文本描述。
2)<name>:指定标签的名字
3)<tag-class>:指定标签处理类的完整路径
4)<body-content>:指定标签体的格式。格式分为如下4种。
l empty:标识标签没有标签体
l scriptless:表示标签体可以包含EL表达式和JSP的动作元素,但是不能包含JSP的脚本元素。
l JSP:表示标签体可以包含JSP代码。
l tagdependent:表示标签体由标签本身去解析处理。若指定tagdependent,那么在标签体中所写的代码将作为纯文本原封不动的传给标签处理类,而不是将执行的结果传给标签处理类。
3、在jsp中导入并使用自定义标签viewIP
<%@ taglib uri="http://www.class3g.com" prefix="class3g" %>
<body>
<class3g:viewIP/>
</body>
4使用自定义标签控制页面内容(标签体)是否输出,利用doStartTag()的返回值控制
return this.SKIP_BODY; //忽略标签体
return this.EVAL_BODY_INCLUDE; //执行标签体
5控制整个jsp的输出
利用doEndTag()的返回值控制
return this.SKIP_PAGE; //跳过页面标签后余下的jsp代码
return this.EVAL_PAGE; //继续执行余下jsp代码
6自定义标签实现内容(标签体)循环输出
利用Tag子接口Iteration中定义的doAfterBody()和返回值EVAL_BODY_AGAIN,SKIP_BODY实现
a) 先覆盖doStartTag()方法,返回EVAL_BODY_INCLUDE
b) 覆盖doAfterBody()
public int doAfterBody() throws JspException { times++; int result = this.EVAL_BODY_AGAIN; if(times>4){ result = this.SKIP_BODY; } return result; } |