开发一个迭代标签,此标签只可以对list进行迭代(学习)。
IterateTag.java:
- package com.keith.tag;
- import java.util.Iterator;
- import java.util.List;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.PageContext;
- import javax.servlet.jsp.tagext.TagSupport;
- public class IterateTag extends TagSupport {
- // 属性名称
- private String name;
- // 属性保存范围
- private String scope;
- // 每次迭代的对象
- private String id;
- // 所以接受到的数据
- private Iterator<?> iter;
- @Override
- public int doStartTag() throws JspException {
- Object value = null;
- // 是否是page范围
- if ("page".equals(this.scope)) {
- value = super.pageContext
- .getAttribute(name, PageContext.PAGE_SCOPE);
- } else if ("request".equals(this.scope)) {
- // 是否是request范围
- value = super.pageContext.getAttribute(name,
- PageContext.REQUEST_SCOPE);
- } else if ("session".equals(this.scope)) {
- // 是否是session范围
- value = super.pageContext.getAttribute(name,
- PageContext.SESSION_SCOPE);
- } else {
- // 是否是application范围
- value = super.pageContext.getAttribute(name,
- PageContext.APPLICATION_SCOPE);
- }
- //如果是List接口的实例
- if (value != null && value instanceof List<?>) {
- //像List接口进行向下转型
- this.iter = ((List<?>) value).iterator();
- if (iter.hasNext()) {
- super.pageContext.setAttribute(id, iter.next());
- //执行标签体内容
- return TagSupport.EVAL_BODY_INCLUDE;
- }else{
- //退出标签执行
- return TagSupport.SKIP_BODY;
- }
- } else {
- //不是List接口实例,不处理
- //退出标签执行
- return TagSupport.SKIP_BODY;
- }
- }
- @Override
- public int doAfterBody() throws JspException {
- //判断是否还有内容
- if (iter.hasNext()) {
- super.pageContext.setAttribute(id, iter.next());
- //重复执行标签体
- return TagSupport.EVAL_BODY_AGAIN;
- }else{
- //退出标签执行
- return TagSupport.SKIP_BODY;
- }
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getScope() {
- return scope;
- }
- public void setScope(String scope) {
- this.scope = scope;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public Iterator<?> getIter() {
- return iter;
- }
- public void setIter(Iterator<?> iter) {
- this.iter = iter;
- }
- }
package com.keith.tag;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;
public class IterateTag extends TagSupport {
// 属性名称
private String name;
// 属性保存范围
private String scope;
// 每次迭代的对象
private String id;
// 所以接受到的数据
private Iterator<?> iter;
@Override
public int doStartTag() throws JspException {
Object value = null;
// 是否是page范围
if ("page".equals(this.scope)) {
value = super.pageContext
.getAttribute(name, PageContext.PAGE_SCOPE);
} else if ("request".equals(this.scope)) {
// 是否是request范围
value = super.pageContext.getAttribute(name,
PageContext.REQUEST_SCOPE);
} else if ("session".equals(this.scope)) {
// 是否是session范围
value = super.pageContext.getAttribute(name,
PageContext.SESSION_SCOPE);
} else {
// 是否是application范围
value = super.pageContext.getAttribute(name,
PageContext.APPLICATION_SCOPE);
}
//如果是List接口的实例
if (value != null && value instanceof List<?>) {
//像List接口进行向下转型
this.iter = ((List<?>) value).iterator();
if (iter.hasNext()) {
super.pageContext.setAttribute(id, iter.next());
//执行标签体内容
return TagSupport.EVAL_BODY_INCLUDE;
}else{
//退出标签执行
return TagSupport.SKIP_BODY;
}
} else {
//不是List接口实例,不处理
//退出标签执行
return TagSupport.SKIP_BODY;
}
}
@Override
public int doAfterBody() throws JspException {
//判断是否还有内容
if (iter.hasNext()) {
super.pageContext.setAttribute(id, iter.next());
//重复执行标签体
return TagSupport.EVAL_BODY_AGAIN;
}else{
//退出标签执行
return TagSupport.SKIP_BODY;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Iterator<?> getIter() {
return iter;
}
public void setIter(Iterator<?> iter) {
this.iter = iter;
}
}
iteratetag.tld:
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
- version="2.1">
- <!-- 标签库的版本 -->
- <tlib-version>1.0</tlib-version>
- <!-- 为标签苦在TLD中的描述名称 -->
- <short-name>iteratetag</short-name>
- <tag>
- <!-- 表示标签在JSP中的使用名称 -->
- <name>iterate</name>
- <!-- 表示这个标签所这项的Class -->
- <tag-class>com.keith.tag.IterateTag</tag-class>
- <!-- 标签体内容为空 -->
- <body-content>JSP</body-content>
- <attribute>
- <!-- format为属性名 -->
- <name>id</name>
- <!-- 表示此值必须设置 -->
- <required>true</required>
- <!-- 表示属性值是请求时表达式的结果 -->
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <!-- format为属性名 -->
- <name>name</name>
- <!-- 表示此值必须设置 -->
- <required>true</required>
- <!-- 表示属性值是请求时表达式的结果 -->
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <!-- format为属性名 -->
- <name>scope</name>
- <!-- 表示此值必须设置 -->
- <required>true</required>
- <!-- 表示属性值是请求时表达式的结果 -->
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <!-- 标签库的版本 --> <tlib-version>1.0</tlib-version> <!-- 为标签苦在TLD中的描述名称 --> <short-name>iteratetag</short-name> <tag> <!-- 表示标签在JSP中的使用名称 --> <name>iterate</name> <!-- 表示这个标签所这项的Class --> <tag-class>com.keith.tag.IterateTag</tag-class> <!-- 标签体内容为空 --> <body-content>JSP</body-content> <attribute> <!-- format为属性名 --> <name>id</name> <!-- 表示此值必须设置 --> <required>true</required> <!-- 表示属性值是请求时表达式的结果 --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <!-- format为属性名 --> <name>name</name> <!-- 表示此值必须设置 --> <required>true</required> <!-- 表示属性值是请求时表达式的结果 --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <!-- format为属性名 --> <name>scope</name> <!-- 表示此值必须设置 --> <required>true</required> <!-- 表示属性值是请求时表达式的结果 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
web.xml:
- <taglib>
- <taglib-uri>iterate</taglib-uri>
- <taglib-location>/WEB-INF/iteratetag.tld</taglib-location>
- </taglib>
<taglib> <taglib-uri>iterate</taglib-uri> <taglib-location>/WEB-INF/iteratetag.tld</taglib-location> </taglib>
index.jsp:
- <%@ page import="java.util.*" %>
- <%@ taglib prefix="iteratetag" uri="iterate"%>
- <body>
- <%
- List<String> all = new ArrayList<String>();
- all.add("java");
- all.add("linux");
- all.add("C");
- request.setAttribute("all",all);
- %>
- <iteratetag:iterate name="all" scope="request" id="url">
- ${url }<br />
- </iteratetag:iterate>
- </body>