这几天上党课少听了一节(jsp的自定义标签)。今天借了本图书馆的书再结合小冯给我的讲解。把基本的知识记下来。
我们需要把自定义一个.tld的文件放置在WEB-INF目录下,名字可自定义。配置可参照系统再带的。
添加一个简单的empty自定义的标签格式是:
<tag>
<name>hello</name>
<tag-class>com.yc.web.taglibs.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
其中 body-content 中还可以配置几个不同的参数
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。
empty:空标记,即起始标记和结束标记之间没有内容。
scriptless:接受文本、EL和JSP动作。
当我们需要在页面传递参数给这个标签的时候我们定义如下:
<tag>
<name>hello2</name>
<tag-class>com.yc.web.taglibs.HelloTag2</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<!-- 是否为必填字段,true和false表示 -->
<required>false</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
其中需要在attribute节点中加入一些定义。
需要传递参数时注意要设定一个set方法
页面引入时我们需要在页头加上一句
<%@ taglib prefix=”yc” uri=”http://java.itcre.com/taglib/yc” %>
其中的uri为自己在.tld中自己设置的,(自定义标签,所有随便定义一个你喜欢的域名都没关系)。
我们在页面使用这个需要传递的参数的标签:
<yc:hello2 name="Wion"/>
标签对应的实现类需要重载几个类的方法。其中有几个返回值
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
对应的,可以实现仿照ForEach。
实现类中这样写:
package com.yc.web.taglibs;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class ForEachTag extends TagSupport {
private Collection items;
private String var;
private Iterator its;
public void setItems(Collection items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
@Override
public int doEndTag() throws JspException {
return super.EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
if (items == null || items.size() < 0) {
return super.SKIP_BODY;
}
its = items.iterator();
if (its.hasNext()) {
Object obj = its.next();
// 将obj存到pageContext(pagecontext,request,session,application)
super.pageContext.setAttribute(var, obj);
}
// 执行标签体
return super.EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
// 判断是否还有下一个,如果有,则再循环body一次
if (its.hasNext()) {
Object obj = its.next();
// 将obj存到pageContext(pagecontext,request,session,application)
super.pageContext.setAttribute(var, obj);
return super.EVAL_BODY_AGAIN;
} else {
return super.SKIP_BODY;
}
}
}
这样配置tab标签:
<tag>
<name>forEach</name>
<tag-class>com.yc.web.taglibs.ForEachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>items</name>
<!-- 是否为必填字duan -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<!-- 是否为必填字duan -->
<required>false</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
在页面使用:
<table border="1">
<yc:forEach items="${list}" var="v">
${v.id} ${v.name} <br/>
</yc:forEach>
</table>
自定义标签可以自己打包成一个Jar包,下次方便引用。
打包方法我截图老师的以作查阅: