偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JSP自定義標簽開發(fā)入門

開發(fā) 后端 前端
JSP自定義標簽開發(fā)入門,簡單標簽的開發(fā)我們只要實現(xiàn)Tag接口即可,為了簡單起見可以直接繼承實現(xiàn)了此接口的TagSupport類。

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

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

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

 

 

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

效果圖:

 

 

在jsp頁面使用此自定義標簽:

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

  1. <!-- 創(chuàng)建需要展現(xiàn)UserInfo的實例(用于測試數(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.     <!-- 給標簽設(shè)置user屬性綁定要展現(xiàn)的UserInfo對象  --> 
  11.     <cc:showUserInfo user="${pageScope.userinfo }" /> 

開發(fā)步驟:

簡單標簽的開發(fā)我們只要實現(xiàn)Tag接口即可,為了簡單起見可以直接繼承實現(xiàn)了此接口的TagSupport類

1 創(chuàng)建自定義標簽類

  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)建標簽庫描述文件.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 在需要使用此標簽的jsp頁面頭部引入

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

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

此致,一個簡單的JSP標簽開發(fā)完成

標簽類說明:

 

 

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

setPageContext() 將所在jsp頁面的pageContext注入進來,目的是為了在后面的方法中可以訪問到j(luò)sp頁面對象的pageContext屬性

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

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

doStartTag() 在開始標簽屬性設(shè)置后調(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)用

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

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

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

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

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

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

清空%tomcat%\conf\目錄

#p#

TagSupport類已經(jīng)為我們實現(xiàn)并擴展了一些方法(比如在上述方法中我們可以直接使用pageContext對象,調(diào)用父標簽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>
<!--如果不需要標簽體則設(shè)置empty,反之設(shè)定jsp -->
<body-content>empty</body-content>
<!—設(shè)定屬性(如果有的話) -->
<attribute>
<!—指定標簽名 -->
<name>user</name>
<!—是否是必須,如果非必須沒設(shè)置則為空 -->
<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頁面使用此自定義標簽:

  1. <!-- 創(chuàng)建需要展現(xiàn)javabean(UserInfo)集合的實例(用于測試數(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. <!-- 給標簽綁定數(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> 

開發(fā)步驟:

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

1 創(chuàng)建自定義標簽類

  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)建標簽庫描述文件.tdl(Tag Library Description)由于目標1種已經(jīng)創(chuàng)建了此文件,我們只需增加此標簽的配置即可

  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 (目標1中已完成,無需修改)

#p#

4 在需要使用此標簽的jsp頁面頭部引入

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

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

標簽類說明:

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

 

 

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

目標3:使用BodyTagSupport

此目標并不會使用實際例子進行顯示,主要是說明為什么,什么情況下需要使用到BodyTag接口或者BodyTagSupport類?

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

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

標簽類說明:

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

 

 

目標4:自定義的函數(shù)庫

1 創(chuàng)建函數(shù)庫類

  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文件中配置 (引用于目標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上演超詳細性能測試大PK
  3. JSP動態(tài)網(wǎng)頁程序設(shè)計詳解
  4. 如何成為一個優(yōu)秀的JSP程序員
  5. JSP轉(zhuǎn)譯成Servlet詳細過程
責(zé)任編輯:陳貽新 來源: 陽陽多的博客
相關(guān)推薦

2009-07-06 16:59:26

JSP自定義標簽

2009-07-06 16:20:50

JSP自定義標簽

2012-02-02 13:45:28

JavaJSP

2009-06-30 10:40:25

JSP自定義標簽

2009-07-02 15:31:49

JSP標簽

2009-06-08 20:13:36

Eclipse自定義控

2009-06-24 15:13:36

自定義JSF組件

2009-08-10 14:16:59

ASP.NET自定義控

2023-09-04 15:06:18

Pytorch靜態(tài)量化動態(tài)量化

2009-08-05 17:03:37

C#自定義控件

2013-05-02 14:08:18

2023-08-10 17:14:52

鴻蒙自定義彈窗

2011-08-02 11:17:13

iOS開發(fā) View

2015-02-12 15:33:43

微信SDK

2009-06-30 17:02:31

J2EE實現(xiàn)分頁

2020-11-25 11:20:44

Spring注解Java

2020-03-28 16:04:26

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

2015-02-12 15:38:26

微信SDK

2013-05-20 17:48:20

2009-07-28 09:32:41

ASP.NET自定義控
點贊
收藏

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