一、extends TagSupport
- 起始标签,标签体,结束标签
- doStartTag():
- 合理返回值为:
- EVAL_BODY_INCLUDE:显示标签体中的内容
- SKIP_BODY:跳过标签体中的内容
- 合理返回值为:
- doBodyAfter():
- 合理返回值为:
- SKIP_BODY:继续执行标签体上的内容
- EVAL_BODY_AGAIN:循环显示标签体中的内容
- 合理返回值为:
- doEndTag():
- 合理返回值为:
- EVAL_PAGE:执行结束标签后的内容
- SKIP_PAGE:不执行结束标签后的内容
- 合理返回值为:
二、extends SimpleTagSupport
关于doTag()方法
三、自定义标签的步骤
1、建立标签的tld文件同时加入约束
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEtaglibPUBLIC"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
2、建立标签的映射类
当然标签的uri也可以在web.xml中配置
body-content参数说明:
参数 | 说明 |
---|---|
JSP | 接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。 |
empty | 空标记,标签体中没有内容 |
scriptless | 接受文本、EL和JSP动作 |
3、导入tag
四、实例演示
实现foreach方法
<taglib>
<jsp-version>1.1</jsp-version>
<tlib-version>1.0</tlib-version>
<!-- <uri>http://alichoto.com/tdl/hello</uri> -->
<short-name>hello</short-name>
<tag>
<name>foreach</name>
<tag-class>com.csw.CustomTag.TagDemo03</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>var</name>
<required>true</required>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</tablib>
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class TagDemo03 extends SimpleTagSupport{
private Object items;
private String var;
public Object getItems() {
return items;
}
public void setItems(Object items) {
if(items instanceof Map) {
this.items = (Map)items;
}
if(items instanceof Collection) {
this.items = (Collection)items;
}
if(items.getClass().isArray()) {
Collection collection = new ArrayList();
int length = Array.getLength(items);
for(int i=0;i<length;i++) {
collection.add(Array.get(items, i));
}
this.items = collection;
}
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
@Override
public void doTag() throws JspException, IOException {
Iterator it=((Collection) this.items).iterator();
while(it.hasNext()){
Object value=it.next();
this.getJspContext().setAttribute(var, value);
this.getJspBody().invoke(null);
}
}
}
jsp上进行测试
<%
List list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
request.setAttribute("list", list);
%>
<alichoto:foreach items="${list }" var="list">
${list }<br>
</alichoto:foreach>
结果为
参考文献
content-type标签
自定义foeach标签
关于EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_BODY_AGAIN、EVAL_PAGE、SKIP_PAGE的区别探讨
自定义foreach标签