java web 自定义标签_JavaWeb学习——自定义标签
自定義標簽
一、自定義標簽概述
使用標準JSP訪問、操作JavaBean,是實現(xiàn)展現(xiàn)(HTML)與業(yè)務(wù)實現(xiàn)(Java代碼)分離的第一步。然而,標準方法功能不夠強大,以至于開發(fā)者無法僅僅使用它們開發(fā)應(yīng)用,還要在JSP頁面中使用Java代碼。
介于JavaBean中解決展現(xiàn)與業(yè)務(wù)實現(xiàn)分離的方法的不完善,就產(chǎn)生了JSP1.1中的自定義標簽。自定義標簽提供了在JavaBean中所不能實現(xiàn)的便利。其中就包括,自定義標簽允許訪問JSP隱藏的對象及它們的屬性。
盡管自定義標簽能編寫無腳本的JSP頁面,但是JSP1.1和JSP1.2中提供的經(jīng)典自定義標簽非常難用。直到JSP2.0,才增加兩個特性,用于改善自定義標簽實現(xiàn)。第一個特性是一個接口——SimpleTag。另一個特性是標簽文件中定義標簽的機制。
自定義標簽的實現(xiàn),叫做標簽處理器,而簡單標簽處理器是指繼承SimpleTag實現(xiàn)的標簽處理器。
二、簡單標簽處理器
實現(xiàn)SimpleTag的標簽處理器都叫作簡單標簽處理器;實現(xiàn)Tag、Iteration及BodyTag的標簽處理器都叫作經(jīng)典標簽處理器。
簡單標簽處理器有著簡單的生命周期,而且比經(jīng)典標簽處理器更加容易實現(xiàn)。SimpleTag接口中用于標簽觸發(fā)的方法只有一個——doTag,并且此方法只執(zhí)行一次。業(yè)務(wù)邏輯、遍歷及頁面內(nèi)容操作都在這里實現(xiàn)。簡單標簽處理器中的頁面內(nèi)容都在JspFragment類的實例中體現(xiàn)。
簡單標簽的生命周期如下:
JSP容器通過簡單標簽處理器的無參數(shù)構(gòu)造器創(chuàng)建它的實例。
JSP容器通過setJspContext的方法,傳入JspContext對象。
如果自定義標簽被另一個自定義標簽所嵌套,JSP容器就會調(diào)用setParent的方法。
JSP容器調(diào)用該標簽中所定義的每個屬性的set方法。
如果需要處理頁面內(nèi)容,JSP容器還會調(diào)用SimpleTag接口的setJspBody方法,把使用JSPFragment封裝的頁面內(nèi)容傳過來。
javax.servlet.jsp.tagext 包中也包含了一個SimpleTag的基礎(chǔ)類:SimpleTagSupport。它提供了SimpleTag所有方法的默認實現(xiàn)。
三、實例
自定義標簽需要有兩個步驟:編寫標簽處理器及注冊標簽。
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 { //標簽處理函數(shù)
JspContext jspContext = getJspContext(); //返回JspFragment關(guān)聯(lián)的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
運行效果:
四.處理屬性
實現(xiàn)SimpleTag接口或者擴展SimpleTagSupport的標簽處理器都可以有屬性。下面的例子展示了名為DateFormatTag的標簽處理器可以將逗號分隔內(nèi)容轉(zhuǎn)換成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頁面實現(xiàn)
TestingFormatterTagUS,UK,Canada,Korea
③效果展示
五.訪問標簽內(nèi)容
在SimpleTag中,可以通過JSP容器傳入的JspFragment來訪問標簽內(nèi)容。JspFragment類提供了多次訪問Jsp中這部分代碼的能力。JSP片段的定義不能包含腳本或者腳本表達式,他只能是文件模板或者JSP標準結(jié)點。
JspFragment類中有兩個方法:getJspContext、invoke。定義如下:
public abstractJspContext getJspContext()public abstract voidinvoke(java.io.Writer writer)throws JspException, java.io.IOException
getJspContext方法返回這個JspFragment關(guān)聯(lián)的JspContext對象。可以通過invoke方法來執(zhí)行這個片段(標簽的內(nèi)容),然后通過指定的Writer對象把它直接輸出。如果把null傳入invoke方法中,那么這個Writer將會被JspFragment所關(guān)聯(lián)的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函數(shù)
一般來說,編寫EL函數(shù)需要以下兩個步驟:
(1)創(chuàng)建一個包含靜態(tài)方法的public類。每個類的靜態(tài)方法表示一個EL函數(shù)。這個類可以不需要實現(xiàn)任何接口或者繼承特定的類。可以像發(fā)布任何類一樣發(fā)布這個類。這個類必須放在應(yīng)用中的/WEB-INF/classes目錄或者它的子目錄下。
(2)用function節(jié)點在標簽庫描述其中注冊這個函數(shù)。
function節(jié)點是taglib節(jié)點的下級節(jié)點,它有如下子節(jié)點:
description:可選,標簽說明。
display-name:在XML工具中顯示的縮寫名字。
icon:可選,在XML工具中使用的icon節(jié)點。
name:函數(shù)的唯一名字。
function-class:該函數(shù)對應(yīng)實現(xiàn)的Java類的全名。
function-signature:該函數(shù)對應(yīng)實現(xiàn)的Java靜態(tài)方法。
example:可選,使用該函數(shù)的示例說明。
function-extension:可以是一個或者多個節(jié)點,在XML工具中使用,用于提供該函數(shù)的更多的細節(jié)。
要使用這個函數(shù),必須將taglib指令中的URI屬性指向標簽庫描述,并指明使用的前綴。然后在JSP頁面中使用如下語法來訪問該函數(shù):
${ 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函數(shù)
Testing reverseString function效果
七、發(fā)布自定義標簽
可以吧自定義的標簽處理器以及標簽描述器打包到JAR包里,這樣就可以把它發(fā)布出來給別人使用了,就像JSTL一樣。這種情況下,需要包含其所有的標簽處理器及描述它們的TLD文件。此外,還需要在描述其中的URI節(jié)點中指定絕對的URI。
為了在應(yīng)用中使用這個庫,需要把這個JAR文件拷貝到應(yīng)用的WEB-INF/lib目錄下。在使用的時候,任何使用自定義標簽的JSP頁面都要使用和這個標簽庫描述器中定義的URL。
------ 天若有情天亦老,人間正道是滄桑 ------
總結(jié)
以上是生活随笔為你收集整理的java web 自定义标签_JavaWeb学习——自定义标签的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提升数据分析能力成熟度之四步曲_数据分析
- 下一篇: BJUI--data-rule规则及自定