?
?
假設我們有一個UserInfo的javabean,那么在JSP頁面使用此標簽只需調(diào)用此標簽即可
<!-- 創(chuàng)建需要展現(xiàn)UserInfo的實例(用于測試數(shù)據(jù)) --> <% UserInfo user = new UserInfo(); user.setUserName("Xuwei"); user.setAge(33); user.setEmail("test@test.test"); pageContext.setAttribute("userinfo", user); %> <!-- 給標簽設置user屬性綁定要展現(xiàn)的UserInfo對象 --> <cc:showUserInfo user="${pageScope.userinfo }" />
?
開發(fā)步驟:
簡單標簽的開發(fā)我們只要實現(xiàn)Tag接口即可,為了簡單起見可以直接繼承實現(xiàn)了此接口的TagSupport類
1 創(chuàng)建自定義標簽類
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..."); return SKIP_BODY; } out.println("<table width='500px' border='1' align='center'>"); out.println("<tr>"); out.println("<td width='20%'>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 { 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; } }
?
備注:要有對應屬性的get和set方法,而不是定義的類型
?
2 在Web-Inf創(chuàng)建標簽庫描述文件.tld(Tag Library Description)
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> <!--版本號--> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>cc</short-name> <uri>/mytaglib</uri> <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> </taglib>
?
3 配置web.xml
<jsp-config> <taglib> <taglib-uri>/mytaglib</taglib-uri> <!—tld文件所在的位置--> <taglib-location>/WEB-INF/mytaglib.tld</taglib-location> </taglib> </jsp-config>
?備注:web.xml中的 <taglib-uri>標簽可以是任意名稱,但是一般我們將其和tld文件中的uri對應起來 ,因為這個是唯一的標示
?
4 在需要使用此標簽的jsp頁面頭部引入
<%@ taglib uri="/mytaglib" prefix="cc"%>
備注:這里的uri="/mytaglib"指的是tld文件的uri
?
我們創(chuàng)建的UserInfoTag類繼承了TagSupport類,而它又實現(xiàn)了Tag接口,Tag接口的生命周期由其所在的容器控制,如下圖:
?
setPageContext() 將所在jsp頁面的pageContext注入進來,目的是為了在后面的方法中可以訪問到jsp頁面對象的pageContext屬性 setParent() 設置此標簽的父標簽 setAttribute() 將標簽中的屬性注入到此class的屬性,不需要自己實現(xiàn)但要提供屬性的get與set方法 doStartTag() 在開始標簽屬性設置后調(diào)用,如果返回SKIP_BODY則忽略標簽之中的內(nèi)容,如果返回EVAL_BODY_INCLUDE則將標簽體的內(nèi)容進行輸出 doEndTag() 在結(jié)束標簽之前調(diào)用,返回SKIP_PAGE跳過整個jsp頁面后面的輸出,返回EVAL_PAGE執(zhí)行頁面余下部分 release() 生命周期結(jié)束時調(diào)用
?
?
目標2:自定義一個類似于Asp.Net中的Reapter控件的標簽
<!-- 創(chuàng)建需要展現(xiàn)javabean(UserInfo)集合的實例(用于測試數(shù)據(jù)) -->
<% 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); %> <!-- 給標簽綁定數(shù)據(jù)源 --> <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>
?
開發(fā)步驟:
要完成此控件我們需要實現(xiàn)一個迭代接口,即IterationTag,由于TagSupport同樣實現(xiàn)了此接口,所以我們繼承此類
?
1 創(chuàng)建自定義標簽類
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創(chuàng)建標簽庫描述文件.tld(Tag Library Description)
由于目標1種已經(jīng)創(chuàng)建了此文件,我們只需增加此標簽的配置即可
<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中已完成,無需修改)
?
4 在需要使用此標簽的jsp頁面頭部引入
<%@ taglib uri="/mytaglib" prefix="cc"%>
?
目標4:自定義的函數(shù)庫
1 創(chuàng)建函數(shù)庫類
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; } }
?
2 在TLD文件中配置 (引用于目標1中的tld文件)
<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>
?
3 JSP中調(diào)用
${cc:formatMyName("wangfei") } ${cc:add(12, 34) }
?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
