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! ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – Array-List里面的构造函数作为参数之一,如何创建一
- 如何将现有的SOAP请求消息导入SoapUI?
- struts2获取服务器临时目录的方法
- java – 用于Yubico OpenPGP智能卡的PGP数据加密
- java – ModelMapper:确保方法的参数为零,并且不返回void
- Java程序员可能犯的3个常见SQL错误
- Java Map.putAll()方法:追加另一个Map对象到当前Map集合
- java – Math.random()如何生成超出“原生”范围的随机数?
- eclipse/intellij idea 远程调试hadoop 2.6.0
- IPUtil工具类,获取本机、远程IP的Java代码