?
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頁面使用此自定義標簽:
-
?
-
<
% ?
-
????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中已完成,無需修改)