尽管在jstl.jar 提供了很多的标签。但是,有的时候并不会满足我们自己的要求。那么这个时候就是需要我们自己来开发一个jstl的标签。在写这个例子之前我们肯定要知道
1.jstl的标签也是对应的一段Java的代码。所以如何让我们定义的标签找到我们自己所写的代码
2.自己创建的标签怎么部署
3.标签中有很多的属性我们这么定义?以及属性是否是必填?以及属性的值的取值(EL ,简单的String,Script,JavaBean)
第一步:添加一个TLD文件在web-inf 目录下
<?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>1.2</jsp-version>
<short-name>SL</short-name>
<uri>StringLength</uri>
<tag>
<name>LG</name>
<tag-class>com.jstl.tlds.StringLengthHandler</tag-class>
<body-content>empty</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
说明: 1.name 表示了比如<c:forEach> 中的forEach
<%@ taglib prefix="r" uri="StringLength" %>
<% String n = "bugatti"; %>
<r:LG value="<%= n%>"/>
<r:LG value="${n}"/>
<r:LG> <jsp:attribute name="value" trim="true"><%= n%></jsp:attribute> </r:LG>
页面的结果
第三步:创建我们处理这个标签的javabean
public class StringLengthHandler extends SimpleTagSupport{
private String value ;
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().write(getReturnValue(value));
}
private String getReturnValue(String value){
if(value != null && value.trim().length() > 0 ){
return "value length : " + value.trim().length() ;
}
return "value is NULL ";
}
public void setValue(String value) {
this.value = value;
}
}
说明: 1.这个javabean中,有一个value的成员变量。他和我们定义的TLD中Attribute的name是一样的serlvet容器在执行到这个标签的时候会自动的调用setXXX()的方法。这里是String类型的,如果是自定类型的Model这么办?
2.当执行这个标签的时候会自动的调用doTag()方法.3.这本来是一个普通的JavaBean,但是,由于extends SimpleTagSupport 所以他具有了处理标签的能力
我们在创建这样的一个TLD文件的时候我们是放在了web-inf 这样的一个目录下面的,servlet容器会自动的去加载这个TLD,也就是部署的意思。当然下面的几个位置也是可以被自动的加载进来的
1.在web-inf目录下
2.在web-inf的一个子目录下
3.在web-inf/lib中的jar文件META-INF目录中里面
以上都是我们容器自动去加载。我们也可以在web.xml中去配置
<jsp-config>
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/StringLength</taglib-uri>
<taglib-location>/WEB-INF/StringLength.tld</taglib-location>
</taglib>
</jsp-config>
这种方式也是可以的。
注:这里我们就是计算一个String的长度 ,当然这只是一个例子计算String长度的例子。