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!

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/chiangchou/p/tag.html
Copyright © 2011-2022 走看看