想必大家都会遇到这样的问题,就是一个项目中有着大量的自定义标签,搞得很烦。于是就决定去看看自定义标签的实现,并写一个遍历集合的标签。
代码说明,简单明了。
想要写一个自定义标签,首先要在WEB-INF下面有个tld文件。用于注册自己写的标签类。
下面是tld文件:Myjstl.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"> <!-- 标签库的配置 --> <!-- 标签库的版本--> <tlib-version>1.0</tlib-version> <!-- 标签库的简称 --> <short-name>my</short-name> <!-- 标签库的引入uri --> <uri>http://www.wk.com/myjstl</uri> <!-- 注册标签 --> <tag> <name>forEach</name> <tag-class>com.wk.diswapper.Myjstl</tag-class> <!-- scriptless: 有标签体,但标签体不能是java脚本(java代码块,jsp表达式),可以是EL表达式,计算结果。 empty:当前标签没有标签体 jsp:已过时 tagdependent:有标签体,且原样将内容显示到浏览器,即使是EL表达式,也不做计算。 --> <body-content>scriptless</body-content> <attribute> <name>items</name> <required>true</required> <!-- runtime expression value 为true表示该属性的值支持EL与jsp表达式 --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>var</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
用于自定义标签的类要继承javax.servlet.jsp.tagext.SimpleTagSupport 用于定义实现SimpleTag的标记处理程序的基类。如:Myjstl.java 这个类需要在上面的tld中进行注册,才能使用。
package com.wk.diswapper; import java.io.IOException; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class Myjstl extends SimpleTagSupport{ //标签的属性反映到标签类中就是一个set属性。 private Object items; private String var;//当前遍历对象放入域中的key public void setItems(Object items) { this.items = items; } public void setVar(String var) { this.var = var; } public Collection getColl(){ if(items instanceof Map){ return ((Map) items).entrySet(); } else if(items instanceof List){ return (List)items; } else if(items instanceof Set){ return (Set)items; } else if(items.getClass().isArray()){ List arr=new ArrayList(); for (int i = 0; i < Array.getLength(items); i++) { arr.add(Array.get(items, i)); } return arr; } return null; } @Override public void doTag() throws JspException, IOException { for (Object obj : getColl()) { this.getJspContext().setAttribute(var, obj); this.getJspBody().invoke(null); } } }
下面是jsp页面片段。
<%
    int[] a={1,2,3,4,5,6};
    pageContext.setAttribute("arr", a);
%>
<my:forEach items="${arr }" var="one">  //这里的标签属性与类中的属性对应。
     ${one }
</my:forEach>
 
                     
                    
                 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号