打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JSP自定义标签/自定义标签打包

有这样一个业务需求:

当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图:

当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面。

用<c:forEach> 标签将所有角色显示出来,那如何勾选该用户已经选择的角色呢,角色是一个集合,用户选择的角色也是一个角色,在遍历角色集合时,还需要查询用户的角色集合中是否有该角色...

以前使用过js,也可以使用<%java code%>,但都不是很方便,而且<%%>这种形式与JSP页面不统一,不方便维护。

所以,自定义标签此时就很方便了,就类似于<c:forEach>,与页面也整体统一了。

  --------------------------------------------------------------自定义标签--------------------------------------------------------------

自定义标签步骤:

1.实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法。

2.编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下。(如果需要打包的话,在src/下建META-INF文件夹,将tld文件放在该文件夹下)

3.完成以上操作,即可在JSP页面中导入和使用自定义标签。

以上面的需求为例:

第一步:自定义标签类[该标签不仅可以适用于复选框,还可以适用于单选框,下拉列表框等]

 1 package com.lizhou.mobilescm.tag; 2  3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.Collection; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.Map; 9 10 import javax.servlet.jsp.JspException;11 import javax.servlet.jsp.JspWriter;12 import javax.servlet.jsp.tagext.SimpleTagSupport;13 14 /**15  * 自定义标签:根据数据将checkbox标记16  * <my:check items="" value="" />17  * @author bojiangzhou18  * @date 2016年4月10日19  */20 /**21  * <my:checked items="" value="" />22  * 输出checked23  * @author bojiangzhou24  * @date 2016年5月4日25  */26 public class CheckedTag extends SimpleTagSupport {27     28     /**29      * 要遍历的数据:Map,List,Object[],Object30      */31     private Object items;32     33     /**34      * 当前值35      */36     private Object value;37     38     public void setItems(Object items) {39         this.items = items;40     }41     42     public void setValue(Object value) {43         this.value = value;44     }45     46     public void doTag() throws IOException {47         //获取输出流48         JspWriter out = this.getJspContext().getOut();49         try {50             if(items instanceof Collection){51                 //items为Map、List类型52                 Collection collection = (Collection) items;53                 Iterator it = collection.iterator();54                 while(it.hasNext()){55                     Object next = it.next();56                     if(next.equals(value)){57                         out.write("checked");58                         break;59                     }60                 }61             } else if(items instanceof Object[]){62                 //items为Object[]数组类型63                 Object[] array = (Object[]) items;64                 for(Object o : array){65                     if(o.equals(value)){66                         out.write("checked");67                         break;68                     }69                 }70             } else{71                 //items为一个简单数据类型72                 if(value.equals(items)){73                     out.write("checked");74                 }75             }76         } catch (Exception e) {77             //如果有异常输出空78             out.write("");79         }80         81     }82     83 }

第二步:编写tld文件(tld文件可以从其它标签包里复制一份即可),记得放在WEB-INF/下,

 1 <?xml version="1.0" encoding="UTF-8" ?> 2  3 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 6     version="2.0"> 7      8   <description>my jstl 1.0</description> 9   <display-name>my jstl</display-name>10   <tlib-version>1.0</tlib-version>11   <short-name>my</short-name> <!-- 标签前缀 -->12   <uri>http://java.sun.com/jsp/jstl/my</uri> <!-- 引用地址 -->13 14   <tag>15     <description>16         out checked17     </description>18     <name>checked</name> <!-- 标签名称 -->19     <tag-class>com.lizhou.mobilescm.tag.CheckedTag</tag-class> <!-- 标签使用的类 -->20     <body-content>empty</body-content> <!-- 标签体是否为空 -->21     <attribute>  <!-- 属性 -->22         <description>23             Collection of items to iterate over.24         </description>25         <name>items</name>26         <required>true</required> <!-- 是否必须 -->27         <rtexprvalue>true</rtexprvalue> <!-- 是否可以使用JSP表达式 -->28     </attribute>29     <attribute>30         <description>31             Current value32         </description>33         <name>value</name>34         <required>true</required>35         <rtexprvalue>true</rtexprvalue>36     </attribute>37   </tag>38   39 </taglib>

 第三步:在JSP页面使用

引入标签:

<%@ taglib uri="http://java.sun.com/jsp/jstl/my" prefix="my" %>

 

使用:

1 <tr>2   <th>角色:</th>3   <td>4     <c:forEach items="${roleList}" var="role">5       <input type="checkbox" name="user.roleIdList" value="${role.id}" <my:checked items="${user.roleIdList}" value="${role.id}"/> />${role.name}6     </c:forEach>7   </td>8 </tr>

 --------------------------------------------------------------自定义标签:函数形式--------------------------------------------------------------

上面是使用标签的形式,在项目中还学到一中自定义标签的方式:函数形式

例如格式化Date类型的日期为字符串:

第一步:定义一个工具类,类中有一个格式化日期的静态方法。[好像只能是静态方法]

 1 package com.lizhou.mobilescm.tool; 2  3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5  6 /** 7  * 时间工具 8  * @author bojiangzhou 9  * @date 2016年5月4日10  */11 public class TimeTool {12     13     /**14      * 将日期格式化成字符串15      * @param date 日期16      * @param pattern 格式:yyyy-MM-dd17      * @return18      */19     public static String formatDate(Date date){20         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");21         return sdf.format(date);22     }23     24 }

第二步:配置tld文件如下:

 1 <?xml version="1.0" encoding="UTF-8" ?> 2  3 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 6     version="2.0"> 7      8   <description>my jstl 1.0</description> 9   <display-name>my jstl</display-name>10   <tlib-version>1.0</tlib-version>11   <short-name>my</short-name>12   <uri>http://java.sun.com/jsp/jstl/my</uri>13 14   <function>15       <description> 16           format the date to string 17       </description>18       <name>dateFormat</name> <!-- 标签名称 -->19       <function-class>com.lizhou.mobilescm.tool.TimeTool</function-class> <!-- 方法所在类 -->20       <function-signature>java.lang.String formatDate(java.util.Date)</function-signature><!-- 方法签名:格式:返回类型 方法名称( 参数类型 ) -->21   </function>22   23 </taglib>

第三步:使用,在EL表达式中使用beginDate是在request中的一个Date类型日期。

1 <input name="beginDate" class="date" value='${my:dateFormat(beginDate)}' readonly/>

 --------------------------------------------------------------自定义标签:打包--------------------------------------------------------------

我们可以将自定义的标签打包成一个jar/war包,形成自己的标签库,以便于以后使用。

那么,打包方式如下:

1.在src/目录下建META-INF文件夹,将my.tld文件移动到该文件夹下

2.点击项目,右键 > Export > 选择Java下的JAR file > next > 

3.然后就可以导入这个标签包使用了

 

OK!

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
JSP的自定义标签
创建JSP自定义标签
JSP自定义标签和EL自定义函数开发
[教程]自定义JSP中的Taglib标签之四自定义标签中的Function函数
JSTL标签库,自定义标签
JSP自定义标签开发+TLD文件元素详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服