加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JSP自定义标签/自定义标签打包

发布时间:2020-12-15 06:48:13 所属栏目:Java 来源:网络整理
导读:有这样一个业务需求: 当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图: 当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面。 用c:forEach 标签将所有角色显示出来,那如何

有这样一个业务需求:

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

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

用<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  java.util.ArrayList;
 5  java.util.Collection;
 6  java.util.Iterator;
 7  java.util.List;
 8  java.util.Map;
 9 
10  javax.servlet.jsp.JspException;
11  javax.servlet.jsp.JspWriter;
12  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 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      Object value;
37     
38     void setItems(Object items) {
39         this.items = items;
40     }
41     
42      setValue(Object value) {
43         this.value = value;
44 45     
46     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  Object[]){
62                 items为Object[]数组类型
63                 Object[] array = (Object[]) items;
64                 for(Object o : array){
65                     (o.equals(value)){
66                         out.write("checked"67                         68 69 70             } else{
71                 items为一个简单数据类型
72                 (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/下,

<?xml version="1.0" encoding="UTF-8" ?>
<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</ 9   display-name>my jstl10   tlib-version>1.011   short-name>my> <!-- 标签前缀 -->
12   uri>http://java.sun.com/jsp/jstl/my> <!-- 引用地址 -->
14   tag15             out checked
17     18     name>checked> <!-- 标签名称?-->
19     tag-class>com.lizhou.mobilescm.tag.CheckedTag> <!-- 标签使用的类 -->
20     body-content>empty> <!-- 标签体是否为空 -->
21     attribute>  <!-- 属性 -->
22                     Collection of items to iterate over.
24         25         >items26         required>true> <!-- 是否必须 -->
27         rtexprvalue> <!-- 是否可以使用JSP表达式 -->
29     30         31             Current value
32         33         >value34         35         37   38   
39 taglib>

?第三步:在JSP页面使用

引入标签:

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

?

使用:

1 tr2   th>角色:3   td4     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:forEach7   8 >

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

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

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

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

 com.lizhou.mobilescm.tool;
 java.text.SimpleDateFormat;
 java.util.Date;
 5 
 * 时间工具
 9 10  class TimeTool {
12     
13          * 将日期格式化成字符串
     * @param date 日期
 pattern 格式:yyyy-MM-dd
@return
18      static String formatDate(Date date){
20         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"21         return sdf.format(date);
23     
24 }

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

function15       > 
          format the date to string 
17       18       >dateFormat> <!-- 标签名称 -->
19       function-class>com.lizhou.mobilescm.tool.TimeTool 方法所在类 20       function-signature>java.lang.String formatDate(java.util.Date)> 方法签名:格式:返回类型 方法名称( 参数类型 ) 21   22   
>

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

="beginDate" class="date"='${my:dateFormat(beginDate)}' readonly/>

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

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

那么,打包方式如下:

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

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

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

?

OK!

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读