自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSP自定義標(biāo)簽開(kāi)發(fā)入門(mén)

開(kāi)發(fā) 后端 前端
JSP自定義標(biāo)簽開(kāi)發(fā)入門(mén),簡(jiǎn)單標(biāo)簽的開(kāi)發(fā)我們只要實(shí)現(xiàn)Tag接口即可,為了簡(jiǎn)單起見(jiàn)可以直接繼承實(shí)現(xiàn)了此接口的TagSupport類(lèi)。

一般情況下開(kāi)發(fā)jsp自定義標(biāo)簽需要引用以下兩個(gè)包

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

首先我們需要大致了解開(kāi)發(fā)自定義標(biāo)簽所涉及到的接口與類(lèi)的層次結(jié)構(gòu)(其中SimpleTag接口與SimpleTagSupport類(lèi)是JSP2.0中新引入的)。

 

 

目標(biāo)1:自定義一個(gè)用表格顯示用戶(hù)信息的簡(jiǎn)單標(biāo)簽

效果圖:

 

 

在jsp頁(yè)面使用此自定義標(biāo)簽:

假設(shè)我們有一個(gè)UserInfo的javabean,那么在JSP頁(yè)面使用此標(biāo)簽只需調(diào)用此標(biāo)簽即可

  1. <!-- 創(chuàng)建需要展現(xiàn)UserInfo的實(shí)例(用于測(cè)試數(shù)據(jù)) --> 
  2.     <%  
  3.     UserInfo user = new UserInfo();  
  4.     user.setUserName("Xuwei");  
  5.     user.setAge(33);  
  6.     user.setEmail("test@test.test");  
  7.     pageContext.setAttribute("userinfo", user);    
  8.     %> 
  9.    
  10.     <!-- 給標(biāo)簽設(shè)置user屬性綁定要展現(xiàn)的UserInfo對(duì)象  --> 
  11.     <cc:showUserInfo user="${pageScope.userinfo }" /> 

開(kāi)發(fā)步驟:

簡(jiǎn)單標(biāo)簽的開(kāi)發(fā)我們只要實(shí)現(xiàn)Tag接口即可,為了簡(jiǎn)單起見(jiàn)可以直接繼承實(shí)現(xiàn)了此接口的TagSupport類(lèi)

1 創(chuàng)建自定義標(biāo)簽類(lèi)

  1. public class UserInfoTag extends TagSupport {  
  2.      
  3.     private UserInfo user;  
  4.    
  5.     @Override  
  6.     public int doStartTag() throws JspException {  
  7.         try {  
  8.             JspWriter out = this.pageContext.getOut();  
  9.             if(user == null) {  
  10.                 out.println("No UserInfo Found...");  
  11.                 return SKIP_BODY;  
  12.             }  
  13.             out.println("<table width='500px' border='1' align='center'>");  
  14.             out.println("<tr>");  
  15.             out.println("<td width='20%'>Username:</td>");  
  16.             out.println("<td>" + user.getUserName() + "</td>");  
  17.             out.println("</tr>");  
  18.             out.println("<tr>");  
  19.             out.println("<td>Age:</td>");  
  20.             out.println("<td>" + user.getAge() + "</td>");  
  21.             out.println("</tr>");  
  22.             out.println("<tr>");  
  23.             out.println("<td>Email:</td>");  
  24.             out.println("<td>" + user.getEmail() + "</td>");  
  25.             out.println("</tr>");  
  26.             out.println("</table>");  
  27.         } catch(Exception e) {  
  28.             throw new JspException(e.getMessage());  
  29.         }  
  30.         return SKIP_BODY;  
  31.     }  
  32.      
  33.     @Override  
  34.     public int doEndTag() throws JspException {  
  35.         return EVAL_PAGE;  
  36.     }  
  37.    
  38.     @Override  
  39.     public void release() {  
  40.         super.release();  
  41.         this.user = null;  
  42.     }  
  43.      
  44.     //getter and setters  
  45.     public UserInfo getUser() {  
  46.         return user;  
  47.     }  
  48.     public void setUser(UserInfo user) {  
  49.         this.user = user;  
  50.     }  
  51. }  
  52.   

2 在Web-Inf創(chuàng)建標(biāo)簽庫(kù)描述文件.tdl(Tag Library Description)

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
  3.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> 
  5. <tlib-version>1.0</tlib-version> 
  6. <jsp-version>2.0</jsp-version> 
  7. <short-name>cc</short-name> 
  8. <uri>/mytaglib</uri> 
  9. <tag> 
  10.     <name>showUserInfo</name> 
  11.     <tag-class>com.mytags.UserInfoTag</tag-class> 
  12.     <body-content>empty</body-content> 
  13.     <attribute> 
  14.         <name>user</name> 
  15.          <required>false</required> 
  16.          <rtexprvalue>true</rtexprvalue> 
  17.     </attribute> 
  18.  </tag> 
  19. </taglib> 

3 配置web.xml

  1. <jsp-config> 
  2.     <taglib> 
  3.         <taglib-uri>/mytaglib</taglib-uri> 
  4.         <taglib-location>/WEB-INF/mytaglib.tld</taglib-location> 
  5.     </taglib> 
  6.   </jsp-config> 

4 在需要使用此標(biāo)簽的jsp頁(yè)面頭部引入

  1. <%@ taglib uri="/mytaglib" prefix="cc"%> 

5 使用(參照上面的使用步驟)

此致,一個(gè)簡(jiǎn)單的JSP標(biāo)簽開(kāi)發(fā)完成

標(biāo)簽類(lèi)說(shuō)明:

 

 

我們創(chuàng)建的UserInfoTag類(lèi)繼承了TagSupport類(lèi),而它又實(shí)現(xiàn)了Tag接口,Tag接口的生命周期由其所在的容器控制,如下圖:

setPageContext() 將所在jsp頁(yè)面的pageContext注入進(jìn)來(lái),目的是為了在后面的方法中可以訪(fǎng)問(wèn)到j(luò)sp頁(yè)面對(duì)象的pageContext屬性

setParent() 設(shè)置此標(biāo)簽的父標(biāo)簽

setAttribute() 將標(biāo)簽中的屬性注入到此class的屬性,不需要自己實(shí)現(xiàn)但要提供屬性的get與set方法

doStartTag() 在開(kāi)始標(biāo)簽屬性設(shè)置后調(diào)用,如果返回SKIP_BODY則忽略標(biāo)簽之中的內(nèi)容,如果返回EVAL_BODY_INCLUDE則將標(biāo)簽體的內(nèi)容進(jìn)行輸出

doEndTag() 在結(jié)束標(biāo)簽之前調(diào)用,返回SKIP_PAGE跳過(guò)整個(gè)jsp頁(yè)面后面的輸出,返回EVAL_PAGE執(zhí)行頁(yè)面余下部分

release() 生命周期結(jié)束時(shí)調(diào)用

特別說(shuō)明:在tomcat4.1之后的版本中默認(rèn)開(kāi)啟了標(biāo)簽緩沖池(websphere和weblogic并不會(huì)這么做),所以執(zhí)行完標(biāo)簽后并不會(huì)執(zhí)行release()方法(_jspDestroy()時(shí)才釋放),也就是說(shuō)同一個(gè)jsp頁(yè)面自定義標(biāo)簽不管使用多少次只會(huì)存在一個(gè)實(shí)例,但也并不是每一個(gè)標(biāo)簽都會(huì)為其創(chuàng)建一個(gè)緩沖池,要根據(jù)參數(shù)來(lái)判斷,例如:

  1. <cc:UserInfoTag user=”…” /> 
  2. <cc:UserInfoTag /> 

上面例子中由于參數(shù)不同就會(huì)創(chuàng)建兩個(gè)標(biāo)簽緩沖池。

這個(gè)問(wèn)題可以通過(guò)設(shè)定tomcat的配置文件加以解決:

在%tomcat%\conf\web.xml加入enablePooling參數(shù),并設(shè)置為false(不緩存自定義標(biāo)簽)。

  1. <init-param> 
  2.   <param-name>enablePooling</param-name> 
  3.   <param-value>false</param-value> 
  4. </init-param> 

清空%tomcat%\conf\目錄

#p#

TagSupport類(lèi)已經(jīng)為我們實(shí)現(xiàn)并擴(kuò)展了一些方法(比如在上述方法中我們可以直接使用pageContext對(duì)象,調(diào)用父標(biāo)簽getParent()等),所以一般情況下我們只需重寫(xiě)doStartTag(),doEndTag() 即可

TLD文件說(shuō)明:

<!--版本號(hào)-->
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>cc</short-name>
<tag>
<!—指定標(biāo)簽名 -->
<name>showUserInfo</name>
<!—指定標(biāo)簽類(lèi)文件的全路徑 -->
<tag-class>com.mytags.UserInfoTag</tag-class>
<!--如果不需要標(biāo)簽體則設(shè)置empty,反之設(shè)定jsp -->
<body-content>empty</body-content>
<!—設(shè)定屬性(如果有的話(huà)) -->
<attribute>
<!—指定標(biāo)簽名 -->
<name>user</name>
<!—是否是必須,如果非必須沒(méi)設(shè)置則為空 -->
<required>false</required>
<rtexprvalue>true</rtexprvalue><!—是否可在屬性中使用表達(dá)式 -->
</attribute>
</tag>

Web.xml文件說(shuō)明:

<jsp-config>
<taglib>
<!--

標(biāo)簽庫(kù)的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>

目標(biāo)2:自定義一個(gè)類(lèi)似于Asp.Net中的Reapter控件的標(biāo)簽

效果圖:

 

 

在jsp頁(yè)面使用此自定義標(biāo)簽:

  1. <!-- 創(chuàng)建需要展現(xiàn)javabean(UserInfo)集合的實(shí)例(用于測(cè)試數(shù)據(jù)) --> 
  2. <%  
  3.     List<UserInfo> users = new ArrayList<UserInfo>();     
  4.     users.add(new UserInfo("Zhangsan", 12, "Zhangsan@163.com"));  
  5.     users.add(new UserInfo("Lisi", 22, "Lisi@sina.com"));  
  6.     users.add(new UserInfo("Wangwu", 33, "Wangwu@qq.com"));  
  7.     pageContext.setAttribute("users", users);  
  8. %> 
  9.    
  10. <!-- 給標(biāo)簽綁定數(shù)據(jù)源  --> 
  11. <table width='500px' border='1' align='center'> 
  12.     <tr> 
  13.         <td width='20%'>UserName</td> 
  14.         <td width='20%'>Age</td> 
  15.         <td>Email</td> 
  16.     </tr> 
  17.     <cc:repeater var="item" items="${pageScope.users }"> 
  18.         <tr> 
  19.             <td>${item.userName }</td> 
  20.             <td>${item.age }</td> 
  21.             <td>${item.email }</td> 
  22.         </tr> 
  23.     </cc:repeater> 
  24. </table> 

開(kāi)發(fā)步驟:

要完成此控件我們需要實(shí)現(xiàn)一個(gè)迭代接口,即IterationTag,由于TagSupport同樣實(shí)現(xiàn)了此接口,所以我們繼承此類(lèi)

1 創(chuàng)建自定義標(biāo)簽類(lèi)

  1. public class Repeater extends TagSupport {  
  2.     private Collection items;  
  3.     private Iterator it;  
  4.     private String var;  
  5.    
  6.     @Override  
  7.     public int doStartTag() throws JspException {  
  8.         if(items == null || items.size() == 0) return SKIP_BODY;  
  9.         it = items.iterator();    
  10.         if(it.hasNext()) {  
  11.             pageContext.setAttribute(var, it.next());  
  12.         }  
  13.         return EVAL_BODY_INCLUDE;  
  14.     }  
  15.      
  16.     @Override  
  17.     public int doAfterBody() throws JspException {  
  18.         if(it.hasNext()) {  
  19.             pageContext.setAttribute(var, it.next());  
  20.             return EVAL_BODY_AGAIN;  
  21.         }  
  22.         return SKIP_BODY;  
  23.     }  
  24.      
  25.     @Override  
  26.     public int doEndTag() throws JspException {  
  27.         return EVAL_PAGE;  
  28.     }  
  29.      
  30.     public void setItems(Collection items) {  
  31.         this.items = items;  
  32.     }  
  33.      
  34.     public void setVar(String var) {  
  35.         this.var = var;  
  36.     }  

2在Web-Inf創(chuàng)建標(biāo)簽庫(kù)描述文件.tdl(Tag Library Description)由于目標(biāo)1種已經(jīng)創(chuàng)建了此文件,我們只需增加此標(biāo)簽的配置即可

  1. <tag> 
  2.     <name>repeater</name> 
  3.     <tag-class>com.mytags.Repeater</tag-class> 
  4.     <body-content>jsp</body-content> 
  5.     <attribute> 
  6.         <name>items</name> 
  7.         <required>false</required> 
  8.         <rtexprvalue>true</rtexprvalue> 
  9.     </attribute> 
  10.     <attribute> 
  11.         <name>var</name> 
  12.         <required>true</required> 
  13.         <rtexprvalue>true</rtexprvalue> 
  14.     </attribute> 
  15.  </tag> 
  16.   

3 配置web.xml (目標(biāo)1中已完成,無(wú)需修改)

#p#

4 在需要使用此標(biāo)簽的jsp頁(yè)面頭部引入

  1. <%@ taglib uri="/mytaglib" prefix="cc"%> 

5 使用(參照上面的使用步驟)

標(biāo)簽類(lèi)說(shuō)明:

我們用到了迭代接口,以下是容器處理此接口的流程

 

 

作為目標(biāo)1中的補(bǔ)充: 在doAfterBody()如果返回值是EVAL_BODY_AGAIN那么將重新執(zhí)行此方法

目標(biāo)3:使用BodyTagSupport

此目標(biāo)并不會(huì)使用實(shí)際例子進(jìn)行顯示,主要是說(shuō)明為什么,什么情況下需要使用到BodyTag接口或者BodyTagSupport類(lèi)?

如果我們需要在 …. 之間的標(biāo)簽體的頭部和尾部加上一些標(biāo)記或者是其他處理,一般的處理方法是在doStartTag和doEndTag方法中進(jìn)行, 但是如果是個(gè)迭代標(biāo)簽,標(biāo)簽體的每段內(nèi)容在循環(huán)輸出時(shí)每次都需要在頭部和尾部加上一些標(biāo)記,我們使用BodyTagSupport就很方便了,

此接口在doStartTag()方法返回值多了一個(gè)EVAL_BODY_BUFFERED,它將對(duì)主體進(jìn)行計(jì)算,并輸出到緩沖區(qū)(注:此處是緩沖區(qū)并非直接輸出到客戶(hù)端,需要我們手動(dòng)(this.bodyContent.getEnclosingWriter().write(this.bodyContent.getString());)進(jìn)行輸出客戶(hù)端的調(diào)用,否則主體內(nèi)容不會(huì)進(jìn)行顯示)

標(biāo)簽類(lèi)說(shuō)明:

關(guān)于BodyTagSupport接口的說(shuō)明

 

 

目標(biāo)4:自定義的函數(shù)庫(kù)

1 創(chuàng)建函數(shù)庫(kù)類(lèi)

  1. public class MyFunctions {  
  2.     public static String formatMyName(String name) {  
  3.        return "your name is " + name;  
  4.     }  
  5.     public static int add(int a, int b) {  
  6.        return a+b;  
  7.     }  

2 在TLD文件中配置 (引用于目標(biāo)1中的tld文件)

  1. <function> 
  2.     <name>formatMyName</name> 
  3.     <function-class>com.taglib.MyFunctions</function-class> 
  4.     <function-signature>java.lang.String formatMyName(java.lang.String)</function-signature> 
  5.  </function> 
  6.    
  7. <function> 
  8.     <name>add</name> 
  9.     <function-class>com.taglib.MyFunctions</function-class> 
  10.     <function-signature>java.lang.String add(int, int)</function-signature> 
  11.  </function> 

3 JSP中調(diào)用

  1. ${cc:formatMyName("wangfei") }  
  2. ${cc:add(12, 34) } 

原文:http://www.cnblogs.com/zhaoyang/archive/2011/12/25/2301108.html

【編輯推薦】

  1. JSP環(huán)境配置圖文詳解 初學(xué)者必備
  2. PHP與JSP上演超詳細(xì)性能測(cè)試大PK
  3. JSP動(dòng)態(tài)網(wǎng)頁(yè)程序設(shè)計(jì)詳解
  4. 如何成為一個(gè)優(yōu)秀的JSP程序員
  5. JSP轉(zhuǎn)譯成Servlet詳細(xì)過(guò)程
責(zé)任編輯:陳貽新 來(lái)源: 陽(yáng)陽(yáng)多的博客
相關(guān)推薦

2009-07-06 16:59:26

JSP自定義標(biāo)簽

2009-07-06 16:20:50

JSP自定義標(biāo)簽

2012-02-02 13:45:28

JavaJSP

2009-07-02 15:31:49

JSP標(biāo)簽

2009-06-30 10:40:25

JSP自定義標(biāo)簽

2009-06-08 20:13:36

Eclipse自定義控

2009-06-24 15:13:36

自定義JSF組件

2009-08-05 17:03:37

C#自定義控件

2023-09-04 15:06:18

Pytorch靜態(tài)量化動(dòng)態(tài)量化

2009-08-10 14:16:59

ASP.NET自定義控

2011-08-02 11:17:13

iOS開(kāi)發(fā) View

2013-05-02 14:08:18

2023-08-10 17:14:52

鴻蒙自定義彈窗

2015-02-12 15:33:43

微信SDK

2009-06-30 17:02:31

J2EE實(shí)現(xiàn)分頁(yè)

2020-03-28 16:04:26

數(shù)據(jù)科學(xué)Matplotlib圖表

2020-11-25 11:20:44

Spring注解Java

2015-02-12 15:38:26

微信SDK

2011-08-11 11:51:07

iPhone鍵盤(pán)

2013-05-20 17:48:20

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)