JSP自定义标签开发入门(1)(2)
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页面使用此自定义标签:
- <!-- 创建需要展现javabeanUserInfo)集合的实例用于测试数据) -->
- <%
- 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中已完成,无需修改)
用户点评