JSP自定義標簽開發入門(1)
JSP自定義標簽開發入門,簡單標簽的開發我們只要實現Tag接口即可,為了簡單起見可以直接繼承實現了此接口的TagSupport類。
AD
:
?
一般情況下開發jsp自定義標簽需要引用以下兩個包
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
首先我們需要大致了解開發自定義標簽所涉及到的接口與類的層次結構(其中SimpleTag接口與SimpleTagSupport類是JSP2.0中新引入的)。
?

?
目標1:自定義一個用表格顯示用戶信息的簡單標簽
效果圖:
?

?
在jsp頁面使用此自定義標簽:
假設我們有一個UserInfo的javabean,那么在JSP頁面使用此標簽只需調用此標簽即可
- <!--?創建需要展現UserInfo的實例(用于測試數據)?--> ?
- ???? < % ?
- ????UserInfo? user ?=? new ?UserInfo(); ?
- ????user.setUserName("Xuwei"); ?
- ????user.setAge(33); ?
- ????user.setEmail("test@test.test"); ?
- ????pageContext.setAttribute("userinfo",?user);?? ?
- ????% > ?
- ? ?
- ???? <!--?給標簽設置user屬性綁定要展現的UserInfo對象??--> ?
- ???? < cc:showUserInfo ? user = "${pageScope.userinfo?}" ? /> ?
開發步驟:
簡單標簽的開發我們只要實現Tag接口即可,為了簡單起見可以直接繼承實現了此接口的TagSupport類
1 創建自定義標簽類
- 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; ?
- ????} ?
- } ?
- ??
2 在Web-Inf創建標簽庫描述文件.tdl(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 > ?
- ???? < 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 > ?
- ???????? < taglib-location > /WEB-INF/mytaglib.tld </ taglib-location > ?
- ???? </ taglib > ?
- ?? </ jsp-config > ?
4 在需要使用此標簽的jsp頁面頭部引入
- < %@?taglib? uri = "/mytaglib" ? prefix = "cc" % > ?
5 使用(參照上面的使用步驟)
此致,一個簡單的JSP標簽開發完成
標簽類說明:
?

?
我們創建的UserInfoTag類繼承了TagSupport類,而它又實現了Tag接口,Tag接口的生命周期由其所在的容器控制,如下圖:
setPageContext() 將所在jsp頁面的pageContext注入進來,目的是為了在后面的方法中可以訪問到jsp頁面對象的pageContext屬性
setParent() 設置此標簽的父標簽
setAttribute() 將標簽中的屬性注入到此class的屬性,不需要自己實現但要提供屬性的get與set方法
doStartTag() 在開始標簽屬性設置后調用,如果返回SKIP_BODY則忽略標簽之中的內容,如果返回EVAL_BODY_INCLUDE則將標簽體的內容進行輸出
doEndTag() 在結束標簽之前調用,返回SKIP_PAGE跳過整個jsp頁面后面的輸出,返回EVAL_PAGE執行頁面余下部分
release() 生命周期結束時調用
特別說明:在tomcat4.1之后的版本中默認開啟了標簽緩沖池(websphere和weblogic并不會這么做),所以執行完標簽后并不會執行release()方法(_jspDestroy()時才釋放),也就是說同一個jsp頁面自定義標簽不管使用多少次只會存在一個實例,但也并不是每一個標簽都會為其創建一個緩沖池,要根據參數來判斷,例如:
- < cc:UserInfoTag ? user =”…”? /> ?
- < cc:UserInfoTag ? /> ?
上面例子中由于參數不同就會創建兩個標簽緩沖池。
這個問題可以通過設定tomcat的配置文件加以解決:
在%tomcat%\conf\web.xml加入enablePooling參數,并設置為false(不緩存自定義標簽)。
- < init-param > ?
- ?? < param-name > enablePooling </ param-name > ?
- ?? < param-value > false </ param-value > ?
- </ init-param > ?
清空%tomcat%\conf\目錄
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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