自定义jstl标签
程序员文章站
2022-06-08 18:07:00
...
步骤如下:
1、写tld文档:用来指定标签的名字,标签库等。
2、写标签处理器类。
3、配置到web.xml中
4、在jsp中使用新定义的标签
例:实现一个自定义标签 功能如下 如果字符串长度超过规定长,则截取,并根据要求添加省略号
tls文档:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>ip</short-name> <uri>http://www.xx.tag</uri> <tag> <name>stringCut</name> <tag-class>com.xx.utils.jstl.JSTLStringCut</tag-class> <attribute> <name>str</name> <required>false</required> <rtexprvalue>true</rtexprvalue><!-- 是否支持el表达式 --> <type>java.lang.String</type> <description>輸入字符串</description> </attribute> <attribute> <name>length</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.Integer</type> <description>要显示字符串的长度</description> </attribute> <attribute> <name>showDot</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.Boolean</type> <description>是否显示点号</description> </attribute> </tag> </taglib>
标签处理器类:
package com.xx.utils.jstl;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class JSTLStringCut extends BodyTagSupport{
private String str ;
private Integer length ;
private Boolean showDot;
@Override
public int doStartTag() throws JspException {
System.out.println(str);
System.out.println(length);
System.out.println(showDot);
try {
if(str==null){
//do nothing
}else{
if(str.length()>length){
str=str.substring(0,length);
if(showDot){
str=str+"...";
}
}
pageContext.getOut().print(str);
}
} catch (IOException e) {
e.printStackTrace();
}
return BodyTagSupport.EVAL_BODY_INCLUDE;//执行标签内容
}
@Override
public int doEndTag() throws JspException {
return BodyTagSupport.EVAL_BODY_INCLUDE;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public Integer getLength() {
return length;
}
public void setLength(Integer length) {
this.length = length;
}
public Boolean getShowDot() {
return showDot;
}
public void setShowDot(Boolean showDot) {
this.showDot = showDot;
}
}
配置到web.xml
<jsp-config> <taglib> <taglib-uri>http://www.xx.tag</taglib-uri> <taglib-location>/WEB-INF/tags/string-cut.tld</taglib-location> </taglib> </jsp-config>
jsp中使用标签
jsp页面顶部加入:
<%@ taglib uri="http://www.xx.tag" prefix="ip" %>
<ip:stringCut str="${str}" length="10" showDot="true"></ip:stringCut>
以下部分转自:http://oyprunner.iteye.com/blog/539494
EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
EVAL_PAGE:继续处理页面,doEndTag()函数可用
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
标签中静态常量:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
上一篇: NFinal 视图—用户控件