import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IterateTag extends BodyTagSupport {
private String name;// 一个属性名
private Iterator it;//要迭代的对象
private String type ;//it中对象的类型
public void setCollection(Collection collection){
it =collection.iterator();
}
@Override
public int doEndTag() throws JspException {
try {
if(bodyContent != null){
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
if(it == null){
return SKIP_BODY;
}else{
return continueNext();
}
}
private int continueNext() {
if(it.hasNext()){
pageContext.setAttribute(name, it.next(),pageContext.PAGE_SCOPE);
return EVAL_BODY_TAG;
}else{
return SKIP_BODY;
}
}
@Override
public int doAfterBody(){
return continueNext();
}
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;
}
}
在doStartTag方法中,如果it不为null,那么就进行第一次迭代。在continueNext方法中如果it还有下一个,那么就继续迭代,如果没有下一个了,就返回SKIP_BODY,表示不再迭代。
除了上面的标签类外,还需要开发一个表示标签信息的类,如下
IterateTEI.java
import javax.servlet.jsp.tagext.*;
//TagExtraInfo用于提供一些在标签翻译时相关的信息。
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
),
};
}
}
这两个类结合使用的目的是,在标签外部获取标签处理类中保存在页面的对象。该对象如果是JavaBean,则可以直接用<jsp:getProperty name=”id” property=”xxx”>取得该javabean的属性值,id是所保存的页面对象对应的变量名。标签外部包括:<prefix:mytag>开始到Page结束的范围,</prefix:mytag>开始到Page结束的范围,<prefix:mytag>和</prefix:mytag>中间的范围。
TagExtraInfo类最重要的一个方法是
public VariableInfo[]
功能是返回所有的与此TagExtraInfo相关联的标签定义类里的变量信息。
VariableInfo类的构造函数
public
ID表示变量名称
ClassName表示类的名称
Declare表示之前是否申明过
Scope表示变量的使用范围:VariableInfo.AT_BEGIN表示从标签起始位置到Page结束,VariableInfo.AT_END表示标签结束位置到Page结束,VariableInfo.NESTED表示标签起止中间的范围。
List list = new ArrayList();
list.add("天龙八部");
list.add("神雕侠侣");
list.add("射雕英雄传");
request.setAttribute("list",list);
%>
<myTag:iterateTag name="book" type="String" collection="<%=list%>">
<%=book.toString() %>
</myTag:iterateTag>

















