本文摘自:李刚 著 《轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发》
续 JSP2自定义标签(一)、JSP2自定义标签(二)
带标签体的标签,可以在标签内嵌入其他内容(包括静态的HTML内容和动态的JSP内容),通常用于完成一些逻辑运算,例如判断和循环。下面一个迭代标签为示例,介绍带标签体标签的开发过程:
package ppp;
import java.io.IOException;
import java.util.Collection;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IteratorTag extends SimpleTagSupport {
// 标签属性,用于指定被迭代的集合
private String Collection;
// 标签属性,用于指定被迭代集合的元素,为集合元素指定名称
private String item;
// collection属性的setter和getter方法
public String getCollection() {
return Collection;
}
public void setCollection(String collection) {
Collection = collection;
}
// item属性的setter和getter方法
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
// 标签处理方法,简单的标签处理类只需要重写doTag()方法
public void doTag() throws IOException, JspException {
// 从pagecontext中获取属性名为collection的集合
Collection itemList = (Collection) getJspContext();
// 遍历集合
for (Object s : itemList) {
// 将集合元素设置到page范围]
getJspContext().setAttribute(item, s);
// 输出标签体
getJspBody().invoke(null);
}
}
}
上面的标签处理类与前面的标签处理类并无太大的不同,该处理类包含了两个属性,并且为这两个属性提供了setter和getter方法。标签处理类的doTag()方法首先从page范围内容获取了指定名称的Collection对象,然后遍历Collection对象的元素,每次遍历都调用getJspBody()方法,该方法返回该标签所包含的标签体:Jspfragment对象,执行该对象的 invoke()方法,即可输出标签体的内容。该标签体的所用是:遍历指定集合,每遍历一个集合元素,即输出标签体一次。
因为该标签的标签体不为空,配置该标签时指定body-content为scriptless,该标签的配置代码片段如下:
<!--定义标签-->
<tag>
<!--定义标签名-->
<name>iterator</name>
<!--定义标签处理类-->
<tag-class>ppp.IteratorTag</tag-class>
<!--定义标签体不允许出现JSP脚本-->
<body-content>scriptless</body-content>
<!--配置标签属性:Collection-->
<attribute>
<name>Collection</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<!--配置标签属性:item-->
<attribute>
<name>item</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
上面的<body-content>scriptless</body-content>代码指定该标签的标签体可以是静态的HTML内容,也可以是表达式语言。
为了测试在JSP中使用该标签的效果,我们首先把一个List对象置成page范围的属性,然后使用该标签来迭代输出List集合的全部元素。
<%@ page contentType="text/html; charset = GBK"%>
<!--导入标签库,指定mytag前缀的标签,
由http://www.crazyit.org/mytaglib的标签库处理-->
<%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
<html>
<head>
<title>带标签体的标签———迭代器标签</title>
</head>
<body>
<h2>带标签体的标签———迭代器标签</h2>
<hr>
<%
//创建一个List对象
List<String> a = new ArrayList<String>();
a.add("hello");
a.add("World");
a.add("java");
//将List对象放入page范围中
pageContext.setAttribute("a", a);
%>
<table border="1" bgcolor="aaaadd" width="300">
<!--使用标签,其中mytag是标签前缀,根据taglib编译指令
mytag前缀将由http://www.crazyit.org/mytaglib的标签库处理-->
<mytag:iterator collection="a" item="item">
<tr>
<td>${pageScope.item}</td>
</tr>
</mytag:iterator>
</table>
</body>
</html>
上面页面的
<mytag:iterator collection="a" item="item">
<tr>
<td>${pageScope.item}</td>
</tr>
</mytag:iterator>代码即可实现通过iterator标签来遍历指定集合。
提示:实际上,JSTL标签库提供了一套功能非常强大的标签,例如,普通的输出标签,刚刚介绍的迭代器标签,和还有用于分支判断的标签,JSTL都非常完善的实现。