一般情況下開發jsp自定義標簽需要引用以下兩個包
import javax
import javax
首先我們需要大致了解開發自定義標簽所涉及到的接口與類的層次結構(其中SimpleTag接口與SimpleTagSupport類是JSP
目標
效果圖
在jsp頁面使用此自定義標簽
假設我們有一個UserInfo的javabean
- <!
創建需要展現UserInfo的實例(用於測試數據) > - <%
- UserInfo user = new UserInfo();
- user
setUserName("Xuwei"); - user
setAge( ); - user
setEmail("test@test test"); - pageContext
setAttribute("userinfo" user); - %>
- <!
給標簽設置user屬性綁定要展現的UserInfo對象 > - <cc:showUserInfo user="${pageScope
userinfo }" />
開發步驟
簡單標簽的開發我們只要實現Tag接口即可
- public class UserInfoTag extends TagSupport {
- private UserInfo user;
- @Override
- public int doStartTag() throws JspException {
- try {
- JspWriter out = this
pageContext getOut(); - if(user == null) {
- out
println("No UserInfo Found "); - &
nbsp; return SKIP_BODY;
- }
- out
println("<table width= px border= align= center >"); - out
println("<tr>"); - out
println("<td width= % >Username:</td>"); - out
println("<td>" + user getUserName() + "</td>"); - out
println("</tr>"); - out
println("<tr>"); - out
println("<td>Age:</td>"); - out
println("<td>" + user getAge() + "</td>"); - out
println("</tr>"); - out
println("<tr>"); - out
println("<td>Email:</td>"); - out
println("<td>" + user getEmail() + "</td>"); - out
println("</tr>"); - out
println("</table>"); - } catch(Exception e) {
- throw new JspException(e
getMessage()); - }
- return SKIP_BODY;
- }
- @Override
- public int doEndTag() throws JspException {
- &nbs
p; return EVAL_PAGE;
- }
- @Override
- public void release() {
- super
release(); - this
user = null; - }
- //getter and setters
- public UserInfo getUser() {
- return user;
- }
- public void setUser(UserInfo user) {
- this
user = user; - }
- }
- <?xml version="
" encoding="UTF "?> - <taglib version="
" xmlns=" - xmlns:xsi="
- xsi:schemaLocation="
- <tlib
version> </tlib version> - <jsp
version> </jsp version> - <short
name>cc</short name> - <uri>/mytaglib</uri>
- <tag>
- <name>showUserInfo</name>
- <tag
class>com mytags UserInfoTag</tag class> - <body
content>empty</body content> - <attribute>
- <name>user</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
- <jsp
config> - <taglib>
- <taglib
uri>/mytaglib</taglib uri>&n
bsp;
- <taglib
location>/WEB INF/mytaglib tld</taglib location> - </taglib>
- </jsp
config>
- <%@ taglib uri="/mytaglib" prefix="cc"%>
此致
標簽類說明
我們創建的UserInfoTag類繼承了TagSupport類
setPageContext() 將所在jsp頁面的pageContext注入進來
setParent() 設置此標簽的父標簽
setAttribute() 將標簽中的屬性注入到此class的屬性
doStartTag() 在開始標簽屬性設置後調用
doEndTag() 在結束標簽之前調用
release() 生命周期結束時調用
特別說明
- <cc:UserInfoTag user=”…” />
- <cc:UserInfoTag />
上面例子中由於參數不同就會創建兩個標簽緩沖池
這個問題可以通過設定tomcat的配置文件加以解決
在%tomcat%\conf\web
- <init
param> - <param
name>enablePooling</param name> - <param
value>false</param value> - </init
param>
清空%tomcat%\conf\目錄
TagSupport類已經為我們實現並擴展了一些方法(比如在上述方法中我們可以直接使用pageContext對象
TLD文件說明
<!
<tlib
<jsp
<short
<tag>
<!—指定標簽名
<name>showUserInfo</name>
<!—指定標簽類文件的全路徑
<tag
<!
<body
<!—設定屬性(如果有的話)
<attribute>
<!—指定標簽名
<name>user</name>
<!—是否是必須
<required>false</required>
<rtexprvalue>true</rtexprvalue><!—是否可在屬性中使用表達式
</attribute>
</tag>
Web
<jsp
<taglib>
<!
標簽庫的uri路徑
即jsp頭文件中聲明<%@ taglib uri="/mytaglib" prefix="cc"%>
的uri
<taglib
<!—tld文件所在的位置
<taglib
</taglib>
</jsp
目標
效果圖
在jsp頁面使用此自定義標簽
- <!
創建需要展現javabean(UserInfo)集合的實例(用於測試數據) > - <%
- List<UserInfo> users = new ArrayList<UserInfo>();
- users
add(new UserInfo("Zhangsan" "Zhangsan@ com")); - users
add(new UserInfo("Lisi" "Lisi@sina com")); - users
add(new UserInfo("Wangwu" "Wangwu@qq com")); - pageContext
setAttribute("users" users); - %>
- <!
給標簽綁定數據源 > - <table width=
px border= align= center > - <tr>
- <td width=
% >UserName</td> - <td width=
% >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>
;
開發步驟
要完成此控件我們需要實現一個迭代接口
- 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() == ) 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) {
- &
nbsp; this
- }
- }
- <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>
- <%@ taglib uri="/mytaglib" prefix="cc"%>
標簽類說明
我們用到了迭代接口
作為目標
目標
此目標並不會使用實際例子進行顯示
如果我們需要在
此接口在doStartTag()方法返回值多了一個EVAL_BODY_BUFFERED
標簽類說明
關於BodyTagSupport接口的說明
目標
>
- public class MyFunctions {
- public static String formatMyName(String name) {
- return "your name is " + name;
- }
- public static int add(int a
int b) { - return a+b;
- }
- }
- <function>
- <name>formatMyName</name>
- <function
class>com taglib MyFunctions</function class> - <function
signature>java lang String formatMyName(java lang String)</function signature> - </function>
- <function>
- <name>add</name>
- <function
class>com taglib MyFunctions</function class> - <function
signature>java lang String add(int int)</function signature> - </function>
- ${cc:formatMyName("wangfei") }
- ${cc:add(
) }
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19809.html