JSP自定义标签开发入门(2)
JSP自定义标签开发入门,简单标签的开发我们只要实现Tag接口即可,为了简单起见可以直接继承实现了此接口的TagSupport类。
AD:
TagSupport类已经为我们实现并扩展了一些方法(比如在上述方法中我们可以直接使用pageContext对象,调用父标签getParent()等),所以一般情况下我们只需重写doStartTag(),doEndTag() 即可
TLD文件说明:
<!--版本号-->
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>cc</short-name>
<tag>
<!—指定标签名 -->
<name>showUserInfo</name>
<!—指定标签类文件的全路径 -->
<tag-class>com.mytags.UserInfoTag</tag-class>
<!--如果不需要标签体则设置empty,反之设定jsp -->
<body-content>empty</body-content>
<!—设定属性(如果有的话) -->
<attribute>
<!—指定标签名 -->
<name>user</name>
<!—是否是必须,如果非必须没设置则为空 -->
<required>false</required>
<rtexprvalue>true</rtexprvalue><!—是否可在属性中使用表达式 -->
</attribute>
</tag>
Web.xml文件说明:
<jsp-config>
<taglib>
<!--
标签库的uri路径
即jsp头文件中声明<%@ taglib uri="/mytaglib" prefix="cc"%>
的uri
-->
<taglib-uri>/mytaglib</taglib-uri>
<!—tld文件所在的位置-->
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
</jsp-config>
目标2:自定义一个类似于Asp.Net中的Reapter控件的标签
效果图:
在jsp页面使用此自定义标签:
-
<!-- 创建需要展现javabean(UserInfo)集合的实例(用于测试数据) -->
-
<
%
-
List
<
UserInfo
>
users
=
new
ArrayList
<
UserInfo
>
();
-
users.add(new UserInfo("Zhangsan", 12, "Zhangsan@163.com"));
-
users.add(new UserInfo("Lisi", 22, "Lisi@sina.com"));
-
users.add(new UserInfo("Wangwu", 33, "Wangwu@qq.com"));
-
pageContext.setAttribute("users", users);
-
%
>
-
-
<!-- 给标签绑定数据源 -->
-
<
table
width
=
'500px'
border
=
'1'
align
=
'center'
>
-
<
tr
>
-
<
td
width
=
'20%'
>
UserName
</
td
>
-
<
td
width
=
'20%'
>
Age
</
td
>
-
<
td
>
Email
</
td
>
-
</
tr
>
-
<
cc:repeater
var
=
"item"
items
=
"${pageScope.users }"
>
-
<
tr
>
-
<
td
>
${item.userName }
</
td
>
-
<
td
>
${item.age }
</
td
>
-
<
td
>
${item.email }
</
td
>
-
</
tr
>
-
</
cc:repeater
>
-
</
table
>
开发步骤:
要完成此控件我们需要实现一个迭代接口,即IterationTag,由于TagSupport同样实现了此接口,所以我们继承此类
1 创建自定义标签类
-
public class Repeater extends TagSupport {
-
private Collection items;
-
private Iterator it;
-
private String var;
-
-
@Override
-
public int doStartTag() throws JspException {
-
if(
items
== null || items.size() == 0) return SKIP_BODY;
-
it
=
items
.iterator();
-
if(it.hasNext()) {
-
pageContext.setAttribute(var, it.next());
-
}
-
return EVAL_BODY_INCLUDE;
-
}
-
-
@Override
-
public int doAfterBody() throws JspException {
-
if(it.hasNext()) {
-
pageContext.setAttribute(var, it.next());
-
return EVAL_BODY_AGAIN;
-
}
-
return SKIP_BODY;
-
}
-
-
@Override
-
public int doEndTag() throws JspException {
-
return EVAL_PAGE;
-
}
-
-
public void setItems(Collection items) {
-
this.items
= items;
-
}
-
-
public void setVar(String var) {
-
this.var
= var;
-
}
-
}
2在Web-Inf创建标签库描述文件.tdl(Tag Library Description)由于目标1种已经创建了此文件,我们只需增加此标签的配置即可
-
<
tag
>
-
<
name
>
repeater
</
name
>
-
<
tag-class
>
com.mytags.Repeater
</
tag-class
>
-
<
body-content
>
jsp
</
body-content
>
-
<
attribute
>
-
<
name
>
items
</
name
>
-
<
required
>
false
</
required
>
-
<
rtexprvalue
>
true
</
rtexprvalue
>
-
</
attribute
>
-
<
attribute
>
-
<
name
>
var
</
name
>
-
<
required
>
true
</
required
>
-
<
rtexprvalue
>
true
</
rtexprvalue
>
-
</
attribute
>
-
</
tag
>
-
3 配置web.xml (目标1中已完成,无需修改)

