想必大家都会遇到这样的问题,就是一个项目中有着大量的自定义标签,搞得很烦。于是就决定去看看自定义标签的实现,并写一个遍历集合的标签。

代码说明,简单明了。

想要写一个自定义标签,首先要在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>

 

posted on 2018-06-25 10:06  王衙内  阅读(328)  评论(0)    收藏  举报