zoukankan      html  css  js  c++  java
  • 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 bojiangzhou
    18  * @date 2016年4月10日
    19  */
    20 /**
    21  * <my:checked items="" value="" />
    22  * 输出checked
    23  * @author bojiangzhou
    24  * @date 2016年5月4日
    25  */
    26 public class CheckedTag extends SimpleTagSupport {
    27     
    28     /**
    29      * 要遍历的数据:Map,List,Object[],Object
    30      */
    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 checked
    17     </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 value
    32         </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-dd
    17      * @return
    18      */
    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!

  • 相关阅读:
    挑战程序设计竞赛 第2章习题 poj 1017 Packets 贪心模拟
    挑战程序设计竞赛 2章习题 poj 2376 Cleaning Shifts
    Leetcode 27. 移除元素 双指针
    Leetcode 26. 删除有序数组中的重复项 双指针
    Leetcode 31. 下一个排列
    webserver 发布问题
    [转]机器学习中的各种距离
    VUE3 + TYPESCRIPT 开发实践总结
    我和ABP vNext 的故事
    ABP Framework 为什么好上手,不好深入?探讨最佳学习姿势!
  • 原文地址:https://www.cnblogs.com/chiangchou/p/tag.html
Copyright © 2011-2022 走看看