TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
开发迭代的标签:iterateTag
对于集合对象的Iterator类对象,在JSP的java代码中需要用while循环或for循环来输出,难于维护,且可复用性不好,程序员总是在大量地做这样的工作,这时可以考虑用迭代的标签来开发,需要输出数据时只须在JSP页面中声明标签即可。
开发迭代的标签,需要
设计
两个Java类:标签实现类和表示标签信息的类。本实例中标签实现类为iterateTag.java,表示标签信息的类为IterateTEI.java。开发迭代的标签可实现IterationTag接口,也可从TagSupport类或BodyTagSupport类继承,由于BodyTagSupport类继承自TagSupport类,而TagSupport类又实现了IterationTag接口,为简化开发,直接从BodyTagSupport类继承即可。 (1)第一步:开发标签实现类和表示标签信息的类。
iterateTag.java
package body;
import java.util.Collection;
import java.util.Iterator;
import javax.Servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.IterationTag;
public class iterateTag extends BodyTagSupport{
private String name;//在pageContext中标识的一个属性名
private Iterator it;//要迭代的对象
private String type;//it中对象的类型
public void setCollection(Collection collection){
if(collection.size()>0)
it=collection.iterator();
}
//----标签开始时调用此方法-------
public int doStartTag(){
if(it==null) return SKIP_BODY;
else return continueNext(it);
}
//----标签体执行完后调用此方法----
public int doAfterBody(){
return continueNext(it);
}
//----标签结束时调用此方法-------
public int doEndTag(){
try{
if(bodyContent!=null)
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}catch(Exception e){
System.out.println(e);
}
return EVAL_PAGE;
}
//----迭代----
protected int continueNext(Iterator it){
if(it.hasNext()){
pageContext.setAttribute(name,it.next(),pageContext.PAGE_SCOPE);
return EVAL_BODY_AGAIN;
}else return SKIP_BODY;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
} 在标签实现类中,有3个属性:name、type和it。其中,name代表在pageContext中标识一个属性的名字;type代表待迭代内容的数据类型;it为要迭代的内容。在doStartTag()方法中,如果it不为null,就开始迭代,迭代时调用continueNext()方法。
TagExtraInfo 和 VariableInfo
这两个类结合使用的目的是,在标签外部获取标签处理类中保存在页面的对象。该对象如果是JavaBean,则可以直接用<jsp:getProperty name=”id” property=”xxx”>取得该javabean的属性值,id是所保存的页面对象对应的变量名。
标签外部包括:
<prefix:mytag>开始到Page结束的范围,
</prefix:mytag>开始到Page结束的范围,
<prefix:mytag>和</prefix:mytag>中间的范围。
TagExtraInfo类最重要的一个方法是
public VariableInfo[]
getVariableInfo(TagData data)
功能是返回所有的与此TagExtraInfo相关联的标签定义类里的变量信息。
VariableInfo类的构造函数
public
VariableInfo(String ID,String ClassName,Boolean Declare, int Scope)
ID表示变量名称
ClassName表示类的名称
Declare表示之前是否申明过
Scope表示变量的使用范围:VariableInfo.AT_BEGIN表示从标签起始位置到Page结束,VariableInfo.AT_END表示标签结束位置到Page结束,VariableInfo.NESTED表示标签起止中间的范围。
IterateTEI.java
package body;
import javax.servlet.jsp.tagext.TagData;
import javax.servlet.jsp.tagext.TagExtraInfo;
import javax.servlet.jsp.tagext.VariableInfo;
//----提供标签翻译时的一些相关信息----
public class IterateTEI extends TagExtraInfo {
public IterateTEI() {
super();
}
public VariableInfo[] getVariableInfo(TagData data){
return new VariableInfo[]{
new VariableInfo(data.getAttributeString("name"),
data.getAttributeString("type"),
true,VariableInfo.NESTED)
};
}
}
VariableInfo类中有几个常量,具体的含义为:
NESTED:标签中的参数在标签开始到标签结束之间是有效的。
AT_BEGIN:标签中的参数在标签开始到使用它的JSP页面结束是有效的。
AT_END:标签中的参数在标签的结束到使用它的JSP页面结束是有效的。 (2)第二步:编写标签描述tld文件。本例在myTag.tld文件中增加内容。在<taglib>与</taglib>之间增加如下内容:
<!-- iterateTag-->
<tag>
<!-- 标签名称-->
<name>iterateTag</name>
<!-- 标签对应的处理类-->
<tag-class>body.iterateTag</tag-class>
<tei-class>body.IterateTEI</tei-class>
<!-- 标签体内容,有标签体则设为jsp-->
<body-content>jsp</body-content>
<!-- 标签的属性声明-->
<attribute>
<name>collection</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>type</name>
<required>true</required>
</attribute>
</tag>
</taglib> (3)第三步:在Web应用的web.xml文件中声明标签库引用。同样,本例与本章前面的实例使用同一个tld文件,因此不必再修改。 (4)第四步:在JSP页面中声明并调用标签。
<%@ taglib uri="/myTag" prefix="myTag" %>
<%@ page contentType="text/HTML;charset=GB2312" %>
<%@ page import="java.util.ArrayList"%>
<head>
<title>开发迭代的标签</title>
</head>
<body>
开发一个迭代的标签,输出结果:<br>
<%//----------设置一个ArrayList对象的初始值----------
ArrayList testCol=new ArrayList();
testCol.add("邓*");
testCol.add("黄*");
testCol.add("邓*");
request.setAttribute("testCol",testCol);
%>
<myTag:iterateTag name="testColOne" collection="<%=testCol%>" type="String">
输出一个值:<%=testColOne.toString()%><br>
</myTag:iterateTag>
</body>
</html> 运行结果:
开发一个迭代的标签,输出结果:
输出一个值:邓*
输出一个值:黄*
输出一个值:邓*
源码下载:http://file.javaxxz.com/2014/10/2/074912922.zip |
|