JSP自定义标签/自定义标签打包
2016-05-04 23:57
190 查看
有这样一个业务需求:
当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图:
当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面。
用<c:forEach> 标签将所有角色显示出来,那如何勾选该用户已经选择的角色呢,角色是一个集合,用户选择的角色也是一个角色,在遍历角色集合时,还需要查询用户的角色集合中是否有该角色...
以前使用过js,也可以使用<%java code%>,但都不是很方便,而且<%%>这种形式与JSP页面不统一,不方便维护。
所以,自定义标签此时就很方便了,就类似于<c:forEach>,与页面也整体统一了。
--------------------------------------------------------------自定义标签--------------------------------------------------------------
自定义标签步骤:
1.实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法。
2.编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下。(如果需要打包的话,在src/下建META-INF文件夹,将tld文件放在该文件夹下)
3.完成以上操作,即可在JSP页面中导入和使用自定义标签。
以上面的需求为例:
第一步:自定义标签类[该标签不仅可以适用于复选框,还可以适用于单选框,下拉列表框等]
第二步:编写tld文件(tld文件可以从其它标签包里复制一份即可),记得放在WEB-INF/下,
第三步:在JSP页面使用
引入标签:
使用:
--------------------------------------------------------------自定义标签:函数形式--------------------------------------------------------------
上面是使用标签的形式,在项目中还学到一中自定义标签的方式:函数形式
例如格式化Date类型的日期为字符串:
第一步:定义一个工具类,类中有一个格式化日期的静态方法。[好像只能是静态方法]
第二步:配置tld文件如下:
第三步:使用,在EL表达式中使用beginDate是在request中的一个Date类型日期。
--------------------------------------------------------------自定义标签:打包--------------------------------------------------------------
我们可以将自定义的标签打包成一个jar/war包,形成自己的标签库,以便于以后使用。
那么,打包方式如下:
1.在src/目录下建META-INF文件夹,将my.tld文件移动到该文件夹下
2.点击项目,右键 > Export > 选择Java下的JAR file > next >
3.然后就可以导入这个标签包使用了
OK!
当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图:
当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面。
用<c:forEach> 标签将所有角色显示出来,那如何勾选该用户已经选择的角色呢,角色是一个集合,用户选择的角色也是一个角色,在遍历角色集合时,还需要查询用户的角色集合中是否有该角色...
以前使用过js,也可以使用<%java code%>,但都不是很方便,而且<%%>这种形式与JSP页面不统一,不方便维护。
所以,自定义标签此时就很方便了,就类似于<c:forEach>,与页面也整体统一了。
--------------------------------------------------------------自定义标签--------------------------------------------------------------
自定义标签步骤:
1.实现SimpleTag接口/SimpleTagSupport类,重写doTag()方法。
2.编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下。(如果需要打包的话,在src/下建META-INF文件夹,将tld文件放在该文件夹下)
3.完成以上操作,即可在JSP页面中导入和使用自定义标签。
以上面的需求为例:
第一步:自定义标签类[该标签不仅可以适用于复选框,还可以适用于单选框,下拉列表框等]
package com.lizhou.mobilescm.tag; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * 自定义标签:根据数据将checkbox标记 * <my:check items="" value="" /> * @author bojiangzhou * @date 2016年4月10日 */ /** * <my:checked items="" value="" /> * 输出checked * @author bojiangzhou * @date 2016年5月4日 */ public class CheckedTag extends SimpleTagSupport { /** * 要遍历的数据:Map,List,Object[],Object */ private Object items; /** * 当前值 */ private Object value; public void setItems(Object items) { this.items = items; } public void setValue(Object value) { this.value = value; } public void doTag() throws IOException { //获取输出流 JspWriter out = this.getJspContext().getOut(); try { if(items instanceof Collection){ //items为Map、List类型 Collection collection = (Collection) items; Iterator it = collection.iterator(); while(it.hasNext()){ Object next = it.next(); if(next.equals(value)){ out.write("checked"); break; } } } else if(items instanceof Object[]){ //items为Object[]数组类型 Object[] array = (Object[]) items; for(Object o : array){ if(o.equals(value)){ out.write("checked"); break; } } } else{ //items为一个简单数据类型 if(value.equals(items)){ out.write("checked"); } } } catch (Exception e) { //如果有异常输出空 out.write(""); } } }
第二步:编写tld文件(tld文件可以从其它标签包里复制一份即可),记得放在WEB-INF/下,
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>my jstl 1.0</description> <display-name>my jstl</display-name> <tlib-version>1.0</tlib-version> <short-name>my</short-name> <!-- 标签前缀 --> <uri>http://java.sun.com/jsp/jstl/my</uri> <!-- 引用地址 --> <tag> <description> out checked </description> <name>checked</name> <!-- 标签名称 --> <tag-class>com.lizhou.mobilescm.tag.CheckedTag</tag-class> <!-- 标签使用的类 --> <body-content>empty</body-content> <!-- 标签体是否为空 --> <attribute> <!-- 属性 --> <description> Collection of items to iterate over. </description> <name>items</name> <required>true</required> <!-- 是否必须 --> <rtexprvalue>true</rtexprvalue> <!-- 是否可以使用JSP表达式 --> </attribute> <attribute> <description> Current value </description> <name>value</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
第三步:在JSP页面使用
引入标签:
<%@ taglib uri="http://java.sun.com/jsp/jstl/my" prefix="my" %>
使用:
<tr> <th>角色:</th> <td> <c:forEach items="${roleList}" var="role"> <input type="checkbox" name="user.roleIdList" value="${role.id}" <my:checked items="${user.roleIdList}" value="${role.id}"/> />${role.name} </c:forEach> </td> </tr>
--------------------------------------------------------------自定义标签:函数形式--------------------------------------------------------------
上面是使用标签的形式,在项目中还学到一中自定义标签的方式:函数形式
例如格式化Date类型的日期为字符串:
第一步:定义一个工具类,类中有一个格式化日期的静态方法。[好像只能是静态方法]
package com.lizhou.mobilescm.tool; import java.text.SimpleDateFormat; import java.util.Date; /** * 时间工具 * @author bojiangzhou * @date 2016年5月4日 */ public class TimeTool { /** * 将日期格式化成字符串 * @param date 日期 * @param pattern 格式:yyyy-MM-dd * @return */ public static String formatDate(Date date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(date); } }
第二步:配置tld文件如下:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>my jstl 1.0</description> <display-name>my jstl</display-name> <tlib-version>1.0</tlib-version> <short-name>my</short-name> <uri>http://java.sun.com/jsp/jstl/my</uri> <function> <description> format the date to string </description> <name>dateFormat</name> <!-- 标签名称 --> <function-class>com.lizhou.mobilescm.tool.TimeTool</function-class> <!-- 方法所在类 --> <function-signature>java.lang.String formatDate(java.util.Date)</function-signature><!-- 方法签名:格式:返回类型 方法名称( 参数类型 ) --> </function> </taglib>
第三步:使用,在EL表达式中使用beginDate是在request中的一个Date类型日期。
<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!
相关文章推荐
- Javascript简介和基础知识
- jstorm的cgroup资源隔离机制
- JSP基础
- JavaScript设计模式
- JSP 6动作
- JSP 9对象
- JavaScript之单例实战
- JSP处理流程图示
- (13)JavaScript之[HTML DOM元素][JS对象]
- JavaScript 详说事件机制之冒泡、捕获、传播、委托
- js函数封装
- bzoj-1012 1012: [JSOI2008]最大数maxnumber(线段树)
- javascript 动态改变onclick事件
- ajax+FormData+javascript 实现无刷新表单注册
- javascript string对象方法replace
- Javascript类型系统[数组,对象,数据类型]
- JS -- 异步加载进度条
- [JavaScript]'this'详解
- JS 操作style属性
- JSP中的遗留问题