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中已完成,无需修改)