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  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!

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&amp;FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = &quot;hello&quot;; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let&#39;s briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越