成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JSP自定義標簽開發入門

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

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

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

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

 

 

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

效果圖:

 

 

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

假設我們有一個UserInfo的javabean,那么在JSP頁面使用此標簽只需調用此標簽即可

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

開發步驟:

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

1 創建自定義標簽類

  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創建標簽庫描述文件.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標簽開發完成

標簽類說明:

 

 

我們創建的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頁面自定義標簽不管使用多少次只會存在一個實例,但也并不是每一個標簽都會為其創建一個緩沖池,要根據參數來判斷,例如:

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

上面例子中由于參數不同就會創建兩個標簽緩沖池。

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

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

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

清空%tomcat%\conf\目錄

#p#

TagSupport類已經為我們實現并擴展了一些方法(比如在上述方法中我們可以直接使用pageContext對象,調用父標簽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>
<!--如果不需要標簽體則設置empty,反之設定jsp -->
<body-content>empty</body-content>
<!—設定屬性(如果有的話) -->
<attribute>
<!—指定標簽名 -->
<name>user</name>
<!—是否是必須,如果非必須沒設置則為空 -->
<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. <!-- 創建需要展現javabean(UserInfo)集合的實例(用于測試數據) --> 
  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. <!-- 給標簽綁定數據源  --> 
  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> 

開發步驟:

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

1 創建自定義標簽類

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

  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那么將重新執行此方法

目標3:使用BodyTagSupport

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

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

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

標簽類說明:

關于BodyTagSupport接口的說明

 

 

目標4:自定義的函數庫

1 創建函數庫類

  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中調用

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

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

【編輯推薦】

  1. JSP環境配置圖文詳解 初學者必備
  2. PHP與JSP上演超詳細性能測試大PK
  3. JSP動態網頁程序設計詳解
  4. 如何成為一個優秀的JSP程序員
  5. JSP轉譯成Servlet詳細過程
責任編輯:陳貽新 來源: 陽陽多的博客
相關推薦

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靜態量化動態量化

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開發 View

2015-02-12 15:33:43

微信SDK

2009-06-30 17:02:31

J2EE實現分頁

2020-11-25 11:20:44

Spring注解Java

2020-03-28 16:04:26

數據科學Matplotlib圖表

2015-02-12 15:38:26

微信SDK

2013-05-20 17:48:20

2009-07-28 09:32:41

ASP.NET自定義控
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩亚洲一区 | 91视频在线 | 中国三级黄色录像 | 综合自拍 | 亚洲网站在线播放 | 色天堂影院 | 波多野结衣中文视频 | 午夜久久av | 久久久久久久久久久丰满 | 亚洲美女一区 | 久久精品国产亚洲 | 久久久久国产一区二区三区四区 | 亚洲一区中文 | 爱综合| 国产欧美一区二区在线观看 | 亚洲首页| 九九在线视频 | 精品久久久久久久久久久久久久 | 国产精品久久久久久久久久免费看 | 亚洲精品国产a久久久久久 午夜影院网站 | 免费的一级视频 | 久国久产久精永久网页 | 欧美理伦片在线播放 | 国产精品久久久久永久免费观看 | 国产一区二区免费在线 | 成人精品一区 | 亚洲一区二区久久 | 欧美黄色片在线观看 | 看av电影 | 久久亚洲欧美日韩精品专区 | 亚洲精品一区二区三区蜜桃久 | 婷婷综合网 | 精品久久久久久久 | 久久久久亚洲精品国产 | 亚洲视频在线观看 | 国产高清视频在线观看 | 99久久久久久 | 在线免费观看视频你懂的 | 韩日免费视频 | 国产操操操| 欧美国产日韩一区二区三区 |