java web 自定义标签_JavaWeb学习——自定义标签
自定義標簽
一、自定義標簽概述
使用標準JSP訪問、操作JavaBean,是實現展現(HTML)與業務實現(Java代碼)分離的第一步。然而,標準方法功能不夠強大,以至于開發者無法僅僅使用它們開發應用,還要在JSP頁面中使用Java代碼。
介于JavaBean中解決展現與業務實現分離的方法的不完善,就產生了JSP1.1中的自定義標簽。自定義標簽提供了在JavaBean中所不能實現的便利。其中就包括,自定義標簽允許訪問JSP隱藏的對象及它們的屬性。
盡管自定義標簽能編寫無腳本的JSP頁面,但是JSP1.1和JSP1.2中提供的經典自定義標簽非常難用。直到JSP2.0,才增加兩個特性,用于改善自定義標簽實現。第一個特性是一個接口——SimpleTag。另一個特性是標簽文件中定義標簽的機制。
自定義標簽的實現,叫做標簽處理器,而簡單標簽處理器是指繼承SimpleTag實現的標簽處理器。
二、簡單標簽處理器
實現SimpleTag的標簽處理器都叫作簡單標簽處理器;實現Tag、Iteration及BodyTag的標簽處理器都叫作經典標簽處理器。
簡單標簽處理器有著簡單的生命周期,而且比經典標簽處理器更加容易實現。SimpleTag接口中用于標簽觸發的方法只有一個——doTag,并且此方法只執行一次。業務邏輯、遍歷及頁面內容操作都在這里實現。簡單標簽處理器中的頁面內容都在JspFragment類的實例中體現。
簡單標簽的生命周期如下:
JSP容器通過簡單標簽處理器的無參數構造器創建它的實例。
JSP容器通過setJspContext的方法,傳入JspContext對象。
如果自定義標簽被另一個自定義標簽所嵌套,JSP容器就會調用setParent的方法。
JSP容器調用該標簽中所定義的每個屬性的set方法。
如果需要處理頁面內容,JSP容器還會調用SimpleTag接口的setJspBody方法,把使用JSPFragment封裝的頁面內容傳過來。
javax.servlet.jsp.tagext 包中也包含了一個SimpleTag的基礎類:SimpleTagSupport。它提供了SimpleTag所有方法的默認實現。
三、實例
自定義標簽需要有兩個步驟:編寫標簽處理器及注冊標簽。
1. 編寫標簽處理器
packagecustomtag;importjava.io.IOException;importjava.util.StringTokenizer;importjavax.servlet.jsp.JspContext;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.JspWriter;importjavax.servlet.jsp.tagext.SimpleTagSupport;public class DataFormatterTag extendsSimpleTagSupport {private String header; //標簽屬性
privateString items;public voidsetHeader(String header) {this.header =header;
}public voidsetItems(String items) {this.items =items;
}public void doTag() throws IOException, JspException { //標簽處理函數
JspContext jspContext = getJspContext(); //返回JspFragment關聯的JspContext對象
JspWriter out = jspContext.getOut(); //通過JspContext實例中的getOut方法獲取JspWriter對象
out.print("
| " + header +" |
StringTokenizer tokenizer= new StringTokenizer(items,",");while(tokenizer.hasMoreElements()) {
String token=tokenizer.nextToken();
out.print("
" + token + "\n");}
out.print("
");}
}
2. 注冊標簽
Simple tag examples
1.0
1.1
My First Taglib Example
/firstTag
dataFormatter
customtag.DataFormatterTag
empty
header
true
items
true
3. 在JSP頁面中使用自定義標簽
1
2
3
4
5
TestingFormatterTag6
7
8
9
10
11
12
13
14 US,UK,Canada,Korea15
16
17
18
19
運行效果:
四.處理屬性
實現SimpleTag接口或者擴展SimpleTagSupport的標簽處理器都可以有屬性。下面的例子展示了名為DateFormatTag的標簽處理器可以將逗號分隔內容轉換成HTML表格。
①標簽處理器
1 packagecustomtag;2
3 importjava.io.IOException;4 importjava.util.StringTokenizer;5
6 importjavax.servlet.jsp.JspContext;7 importjavax.servlet.jsp.JspException;8 importjavax.servlet.jsp.JspWriter;9 importjavax.servlet.jsp.tagext.SimpleTagSupport;10
11 public class DataFormatterTag extendsSimpleTagSupport {12 privateString header;13 privateString items;14
15 public voidsetHeader(String header) {16 this.header =header;17 }18
19 public voidsetItems(String items) {20 this.items =items;21 }22
23 public void doTag() throwsIOException, JspException {24 JspContext jspContext =getJspContext();25 JspWriter out =jspContext.getOut();26
27 out.print("
| " + header +" |
| " + token + " |
34 out.print("
");35 }36 }②jsp頁面實現
TestingFormatterTagUS,UK,Canada,Korea
③效果展示
五.訪問標簽內容
在SimpleTag中,可以通過JSP容器傳入的JspFragment來訪問標簽內容。JspFragment類提供了多次訪問Jsp中這部分代碼的能力。JSP片段的定義不能包含腳本或者腳本表達式,他只能是文件模板或者JSP標準結點。
JspFragment類中有兩個方法:getJspContext、invoke。定義如下:
public abstractJspContext getJspContext()public abstract voidinvoke(java.io.Writer writer)throws JspException, java.io.IOException
getJspContext方法返回這個JspFragment關聯的JspContext對象。可以通過invoke方法來執行這個片段(標簽的內容),然后通過指定的Writer對象把它直接輸出。如果把null傳入invoke方法中,那么這個Writer將會被JspFragment所關聯的JspContext對象中的getOut方法返回的JspWriter所接管。下面看一個示例:
SelectElementTag
packagecustomtag;importjava.io.IOException;importjavax.servlet.jsp.JspContext;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.JspWriter;importjavax.servlet.jsp.tagext.SimpleTagSupport;public class SelectElementTag extendsSimpleTagSupport{private String[] countries = {"Australia", "Brazil", "China"};public void doTag() throwsIOException, JspException {
JspContext jspContext=getJspContext();
JspWriter out=jspContext.getOut();
out.print("\n");for(int i=0;i<3;i++){
getJspContext().setAttribute("value", countries[i]);
getJspContext().setAttribute("text", countries[i]);
getJspBody().invoke(null);
}
out.print("\n");
}
}
注冊SelectElementTag
select
customtag.SelectElementTag
scriptless
selectElementTagTest頁面
Testing SelectElementFormatterTag${text}
效果
六、編寫EL函數
一般來說,編寫EL函數需要以下兩個步驟:
(1)創建一個包含靜態方法的public類。每個類的靜態方法表示一個EL函數。這個類可以不需要實現任何接口或者繼承特定的類。可以像發布任何類一樣發布這個類。這個類必須放在應用中的/WEB-INF/classes目錄或者它的子目錄下。
(2)用function節點在標簽庫描述其中注冊這個函數。
function節點是taglib節點的下級節點,它有如下子節點:
description:可選,標簽說明。
display-name:在XML工具中顯示的縮寫名字。
icon:可選,在XML工具中使用的icon節點。
name:函數的唯一名字。
function-class:該函數對應實現的Java類的全名。
function-signature:該函數對應實現的Java靜態方法。
example:可選,使用該函數的示例說明。
function-extension:可以是一個或者多個節點,在XML工具中使用,用于提供該函數的更多的細節。
要使用這個函數,必須將taglib指令中的URI屬性指向標簽庫描述,并指明使用的前綴。然后在JSP頁面中使用如下語法來訪問該函數:
${ prefix:functionName(parameterList) }
具體看以下示例:
StringFunction類中的reverseString方法
packagefunction;public classStringFunctions {public staticString reverseString(String s){return newStringBuffer(s).reverse().toString();
}
}
functiontags.tld文件
Function tag examples
1.0
Reverses a String
reverseString
function.StringFunctions
java.lang.String reverseString(java.lang.String)
使用EL函數
Testing reverseString function效果
七、發布自定義標簽
可以吧自定義的標簽處理器以及標簽描述器打包到JAR包里,這樣就可以把它發布出來給別人使用了,就像JSTL一樣。這種情況下,需要包含其所有的標簽處理器及描述它們的TLD文件。此外,還需要在描述其中的URI節點中指定絕對的URI。
為了在應用中使用這個庫,需要把這個JAR文件拷貝到應用的WEB-INF/lib目錄下。在使用的時候,任何使用自定義標簽的JSP頁面都要使用和這個標簽庫描述器中定義的URL。
------ 天若有情天亦老,人間正道是滄桑 ------
總結
以上是生活随笔為你收集整理的java web 自定义标签_JavaWeb学习——自定义标签的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提升数据分析能力成熟度之四步曲_数据分析
- 下一篇: java美元兑换,(Java实现) 美元