有这样一个业务需求:

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

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

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

JSP自定义标签/自定义标签打包的更多相关文章

  1. JSP自定义标签(标签处理器 tld文件)

    标签的形式如下,标签处理器就是处理JSP页面中的标签的属性和内容,定义好之后就跟使用JSTL一样 <标签名 属性名="属性值" 属性名="属性值"> ...

  2. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

  3. JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用

    1.标签 以类似于html标签的方式实现的java代码的封装. 第一:形成了开发标签的技术标准---自定义标签的技术标准. 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl, ...

  4. JSP自定义标签——简单标签(2)

    在前一篇博客中,我们已经学习了自定义的简单标签的基本使用方法,这一篇我们来学习如何在简单标签中添加标签属性.对自定义标签添加一些属性,可以使我们的标签功能更加灵活和复用.例如前一篇博客使用简单标签来对 ...

  5. JSP自定义标签——简单标签(1)

    前面一篇博客介绍了自定义标签的传统标签使用方式,但是我们会发现,使用传统标签非常的麻烦,而且接口还多,现在传统标签基本都没用了,除了一些比较久的框架.Sun公司之后推出了一个新的标签使用方式,称之为简 ...

  6. JSP自定义标签——传统标签

    同JSP标签一样,自定义标签主要用于移除JSP页面中的Java代码,可以看到我们在JSP中其实是禁止使用Java脚本的,任何要想通过Java代码实现的功能都必须以标签形式来处理,可以使用JSP标签,J ...

  7. JSP入门之自定义标签

    第二部分简单讲解:主要讲解el表达式,核心标签库.本章主要讲解:自定义标签库:404页面,505页面,错误页面配置方法 全部代码下载:链接 1.JSP自定义标签: 自定义标签是用户定义的JSP语言元素 ...

  8. JSP自定义tld方法标签

    卧槽 我们可以通过tld文件,自定义一个方法标签,以便在页面中使用,目录通常放在WEB-INF下面的tlds文件夹: 引入方式示例,直接在jsp上引入tld标签文件: <%@ taglib pr ...

  9. javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)

    一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现T ...

随机推荐

  1. Android drawable微技巧

    家都知道,在Android项目当中,drawable文件夹都是用来放置图片资源的,不管是jpg.png.还是9.png,都可以放在这里.除此之外,还有像selector这样的xml文件也是可以放在dr ...

  2. AJAX(JS&&JQ&&H5)

    一 AJAX的简介: AJAX是"Asynchronous Javascript And XML"(异步JavaScript和XML),通过后台与服务器实现少量的数据交换,可以使页 ...

  3. OFDM学习之旅

    前言: 这些日子开始准备搞OFDM之类的,未动先行matlab仿真,这里我会慢慢更新,基本上是自己学习感悟吧<未完待续> 一.PRBS PRBS 是 Pseudo Random Binar ...

  4. cordova 打包发布正式版 apk

    cordova build android —release 笔者观察了一下新版Cordova,用的是gradle来build项目,所以网上的那些设置ant.properties的解决方法都排除掉,不 ...

  5. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  6. 第一、初识C语言

    1·C语言强大而灵活,如python,LISP,FORTRAN,Perl,Logo,BASIC,PASACAL的编译器和解释器都是C语言编写的. 2·C语言的指针错误往往难以察觉,但这恰好告诉我们,一 ...

  7. widgets、dialogs与自动连接(auto-connect)

    QMetaObject的自动连接设施(auto-connect facilities)可以自动将槽与信号连接起来,只需要声明和定义一个符合标准命名规则的槽函数 void on_<object n ...

  8. dm9000网口收发控制以及mac地址过滤设置

    目的 :完成网口收发调试   过程 :      1.网口初始化,根据芯片数据手册配置   2.网口发数,先向DM9000中的TX FIFO存入数据,然后出发发送寄存器完成发送:   3.网口接收 . ...

  9. swift开发学习网站

    1.https://github.com/Aufree/trip-to-iOS#ios- 2.http://www.code4app.com/forum.php?mod=viewthread& ...

  10. HDU 5860 Death Sequence(死亡序列)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...