javascript
Java Web之自定义JSP标签
Java Web之自定義JSP標(biāo)簽
write:2022-5-7
上文:Java Web之使用過(guò)濾器,
前面我們學(xué)習(xí)了JSP自帶的標(biāo)簽:Java web之JSP技術(shù)詳解,但自帶標(biāo)簽數(shù)量有限,從JSP1.1開始出現(xiàn)了自定義JSP標(biāo)簽技術(shù),允許用戶創(chuàng)建客戶化的標(biāo)簽,從而完成特定需求的功能。
文章目錄
- 1. 理解自定義JSP標(biāo)簽的作用
- 2. 掌握創(chuàng)建并運(yùn)用自定義JSP標(biāo)簽的步驟
- 3. 了解JSP Tag API
- 3.1 標(biāo)簽的處理類
- 3.2 TagSupport類
- 3.3 PageContext類
- 3.4 doStartTag()方法的返回值
- 3.5 doEndTag()方法的返回值
- 3.6 用戶自定義的標(biāo)簽屬性
- 4. Servlet容器處理自定義標(biāo)簽的流程
- 4.1 范例1:創(chuàng)建hello標(biāo)簽
- 4.2 范例2:創(chuàng)建message標(biāo)簽
- 5. 練習(xí)題
1. 理解自定義JSP標(biāo)簽的作用
自定義JSP標(biāo)簽技術(shù)是在JSP 1.1版本中才出現(xiàn)的,它支持用戶在JSP文件中自定義標(biāo)簽,這樣可以使JSP代碼更加簡(jiǎn)潔。
自定義標(biāo)簽是可重用的
自定義標(biāo)簽?zāi)芴幚韽?fù)雜的邏輯運(yùn)算和事務(wù),或者定義JSP網(wǎng)頁(yè)的輸出內(nèi)容和格式。
2. 掌握創(chuàng)建并運(yùn)用自定義JSP標(biāo)簽的步驟
因?yàn)樽远x的JSP標(biāo)簽可以被重復(fù)使用,因此創(chuàng)建自定義JSP標(biāo)簽和在JSP文件中使用自定義JSP標(biāo)簽是獨(dú)立的;
(1)創(chuàng)建標(biāo)簽的處理類(決定標(biāo)簽完成的功能)
(2)創(chuàng)建XML格式的標(biāo)簽庫(kù)描述文件
(1)在web.xml文件中聲明所引用的自定義標(biāo)簽所在的標(biāo)簽庫(kù)(標(biāo)簽庫(kù):組織和管理一組功能相關(guān)的標(biāo)簽)
(2)在JSP文件中引入標(biāo)簽庫(kù),然后插入標(biāo)簽,例如:< mm:hello/>
3. 了解JSP Tag API
3.1 標(biāo)簽的處理類
Servlet容器執(zhí)行JSP文件時(shí),如果遇到自定義標(biāo)簽,就會(huì)調(diào)用這個(gè)標(biāo)簽的處理類。
標(biāo)簽處理類必須擴(kuò)展以下兩個(gè)類之一:
javax.servlet.jsp.TagSupport或者javax.servlet.jsp.BodyTagSupport
下面主要結(jié)束如何擴(kuò)展TagSupport類
3.2 TagSupport類
doStartTag():Servlet容器遇到自定義標(biāo)簽的起始標(biāo)志(即:<)時(shí)調(diào)用該方法
doEndTag():Servlet容器遇到自定義標(biāo)簽的結(jié)束標(biāo)志(即:/>)時(shí)調(diào)用該方法
setValue(String k,Object o):在標(biāo)簽處理類中設(shè)置key/value
getValue(String k): 在標(biāo)簽處理類中根據(jù)參數(shù)key返回匹配的value
removeValue(String k):在標(biāo)簽處理類中刪除key/value
(1)兩個(gè)屬性
parent:引用嵌套了當(dāng)前標(biāo)簽的上層標(biāo)簽(父標(biāo)簽)的處理類對(duì)象
pageContext:引用當(dāng)前JSP頁(yè)面的javax.servlet.jsp.PageContext對(duì)象
(2)與屬性對(duì)應(yīng)的方法
setPageContext(PageContext pc):設(shè)置PageContext對(duì)象,該方法由Servlet容器在調(diào)用doStartTag或doEndTag方法前調(diào)用
setParent(Tag t):設(shè)置嵌套了當(dāng)前標(biāo)簽的上層標(biāo)簽的處理類,該方法由Servlet容器在調(diào)用doStartTag()方法前調(diào)用
getParent():返回嵌套了當(dāng)前標(biāo)簽的上層標(biāo)簽的處理類對(duì)象
Servlet容器在調(diào)用doStartTag() 方法前,會(huì)先調(diào)用setPageContext()和setParent()方法,設(shè)置pageContext和parent屬性。
parent屬性是private類型的,在doStartTag()或doEndTag()方法中可以通過(guò)getParent()方法獲取上層父標(biāo)簽的處理類對(duì)象;
在TagSupport類中定義了protected類型的pageContext成員變量,因此在標(biāo)簽處理類中可以直接訪問(wèn)pageContext變量。
3.3 PageContext類
TagSupport類的兩個(gè)重要屬性之一:PageContext類
PageContext類本身由Servlet容器創(chuàng)建,它是Servlet容器為JSP頁(yè)面提供的得力助手,在JSP頁(yè)面的自定義標(biāo)簽也可以使用這個(gè)得力助手;
PageContext類提供了保存和訪問(wèn)Web應(yīng)用的各個(gè)范圍內(nèi)的共享數(shù)據(jù)的方法:
public void setAttribute(String name, Object value, int scope)//存放 public Object getAttribute(String name, int scope)//訪問(wèn)其中,scope參數(shù)用來(lái)指定屬性存在的范圍,它的可選值包括:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
例如:
3.4 doStartTag()方法的返回值
TagSupport類的主要方法之一:doStartTag():Servlet容器遇到自定義標(biāo)簽的起始標(biāo)志(即:<)時(shí)調(diào)用該方法
doStartTag()方法返回一個(gè)整數(shù)值,用來(lái)決定程序的后續(xù)流程。它有兩個(gè)可選值:
Tag.SKIP_BODY表示標(biāo)簽之間的內(nèi)容被忽略。
Tag.EVAL_BODY_INCLUDE表示標(biāo)簽之間的內(nèi)容被正常執(zhí)行。
例如對(duì)于以下代碼:
< prefix: Mytag>
Hello
……
……
< /prefix:Mytag>
假若< Mytag>的doStartTag()方法返回Tag.SKIP_BODY,”Hello”字符串不會(huì)顯示在網(wǎng)頁(yè)上;若返回Tag.EVAL_BODY_INCLUDE,“Hello” 字符串將顯示在網(wǎng)頁(yè)上。
3.5 doEndTag()方法的返回值
TagSupport類的主要方法之一:doEndTag():Servlet容器遇到自定義標(biāo)簽的結(jié)束標(biāo)志(即:/>)時(shí)調(diào)用該方法
doEndTag()方法也返回一個(gè)整數(shù)值,用來(lái)決定程序后續(xù)流程。它有兩個(gè)可選值:
Tag.SKIP_PAGE:表示立刻停止執(zhí)行JSP網(wǎng)頁(yè),網(wǎng)頁(yè)上未處理的靜態(tài)內(nèi)容和JSP程序代碼均被忽略,任何已有的輸出內(nèi)容立刻返回到客戶的瀏覽器上。
Tag.EVAL_PAGE:表示按正常的流程繼續(xù)執(zhí)行JSP網(wǎng)頁(yè)。
3.6 用戶自定義的標(biāo)簽屬性
在標(biāo)簽中還能包含自定義的屬性,例如:
< prefix:mytag username=“Tom">
……
……
< /prefix:mytag>
在標(biāo)簽處理類中應(yīng)該將這個(gè)屬性作為成員變量,并且分別提供設(shè)置和讀取屬性的方法;
假定以上username為String類型,可以定義如下方法:
private String username;
public void setUsername(String value){
this.username=value;
}
public String getUsername(){
return username;
}
4. Servlet容器處理自定義標(biāo)簽的流程
4.1 范例1:創(chuàng)建hello標(biāo)簽
定義一個(gè)名為mytaglib的標(biāo)簽庫(kù),它包含一個(gè)簡(jiǎn)單的hello標(biāo)簽,這個(gè)標(biāo)簽?zāi)軌驅(qū)SP頁(yè)面中所有的< mm:hello/>解析為字符串“hello”。
hello標(biāo)簽的處理類HelloTag
創(chuàng)建hello標(biāo)簽的標(biāo)簽庫(kù)的描述文件
創(chuàng)建Tag Library的描述文件mytaglib.tld文件,在這個(gè)文件中定義mytaglib標(biāo)簽庫(kù)和hello標(biāo)簽。這個(gè)文件存放位置為/WEB-INF/mytaglib.tld。
如果某個(gè)web應(yīng)用需要使用名為mytaglib的標(biāo)簽庫(kù)中的標(biāo)簽,就需要在web應(yīng)用中加入標(biāo)簽庫(kù)的描述文件mytaglib.tld文件:把mytaglib.tld文件放在/WEB-INF下,目錄/WEB-INF/mytaglib.tld;
在web.xml文件中加入< taglib>元素
在JSP文件中加入hello標(biāo)簽
(1)在hellowithtag1.jsp中加入引用mytaglib的taglib指令:<%@ taglib uri=“/mytaglib” prefix=“mm” %>
以上taglib指令中,prefix屬性用來(lái)指定引用mytaglib標(biāo)簽庫(kù)時(shí)的前綴(所有以mm開頭的標(biāo)簽都來(lái)自mytaglib標(biāo)簽庫(kù))。
(2)在hellowithtag1.jsp文件中插入hello標(biāo)簽:
< b>< mm:hello/> :
<%= request.getParameter(“username") %>
訪問(wèn)hellowithtag1.jsp:
http://localhost:8080/hellowithtag1.jsp?username=weiqin
4.2 范例2:創(chuàng)建message標(biāo)簽
創(chuàng)建一個(gè)能替換helloapp應(yīng)用中JSP網(wǎng)頁(yè)的靜態(tài)文本的標(biāo)簽,這個(gè)標(biāo)簽名為message,它放在mytaglib標(biāo)簽庫(kù)中。
在hellowithtag2.jsp文件中使用message標(biāo)簽的代碼如下:
< b>< mm:message key=“hello.hello” /> :
<%= request.getAttribute(“username") %>< /b>
當(dāng)客戶訪問(wèn)hello.jsp網(wǎng)頁(yè)時(shí),message標(biāo)簽的處理類會(huì)根據(jù)屬性key的值從一個(gè)文本文件中找到與key匹配的字符串。假定這個(gè)字符串為“Hello”,然后將這個(gè)字符串輸出到網(wǎng)頁(yè)上。
創(chuàng)建包含JSP網(wǎng)頁(yè)靜態(tài)文本的文件
首先將創(chuàng)建包含JSP網(wǎng)頁(yè)靜態(tài)文本的文件,這些文本以key=value的形式存放,這個(gè)文件名為messageresource.properties:
在Web應(yīng)用啟動(dòng)時(shí)裝載靜態(tài)文本
盡管裝載靜態(tài)文本的任務(wù)可以直接由標(biāo)簽處理類來(lái)完成,但是把初始化的操作安排在Web應(yīng)用啟動(dòng)時(shí)完成,這更符合Web編程的規(guī)范。
在本例中,由LoadServlet類的init方法負(fù)責(zé)從靜態(tài)文本文件中讀取靜態(tài)文本,然后把它們裝載到Properties對(duì)象中,最后再把這個(gè)Properties對(duì)象作為屬性保存到ServletContext中。
LoadServlet類的init方法
為了保證在Web應(yīng)用啟動(dòng)時(shí)就加載LoadServlet,應(yīng)該在web.xml中配置這個(gè)Servlet時(shí)設(shè)置load-on-startup屬性:
<servlet><servlet-name>load</servlet-name><servlet-class>mypack.LoadServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>創(chuàng)建MessageTag標(biāo)簽處理類
MessageTag包含一個(gè)成員變量key,它與message標(biāo)簽的屬性key對(duì)應(yīng)。在MessageTag中定義了getKey和setKey方法:
在mytaglib庫(kù)中定義message標(biāo)簽
<tag>//定義一個(gè)標(biāo)簽<name>message</name>//標(biāo)簽名<tag-class>mypack.MessageTag</tag-class>//標(biāo)簽處理類<body-content>empty</body-content>//標(biāo)簽主體的類型<info>produce message by key</info>//標(biāo)簽的說(shuō)明信息<attribute><name>key</name>//屬性<required>true</required>//屬性是否需要賦值</attribute></tag>5. 練習(xí)題
選項(xiàng):
(A)在TagSupport類中定義了session成員變量,直接調(diào)用它的getAttribute()方法即可。
(B)在標(biāo)簽處理類TagSupport類中定義了pageContext成員變量,先通過(guò)它的getSession()方法獲得當(dāng)前的HttpSession對(duì)象,再調(diào)用HttpSession對(duì)象的getAttribute()方法。
?pageContext.getAttribute(“attributename”,PageContext.SESSION_SCOPE)
答案: B,C
選項(xiàng):
(A) Tag.SKIP_BODY
(B) Tag.SKIY_PAGE
? Tag.EVAL_BODY_INCLUDE
(D) Tag.EVAL_PAGE
答案: A,C
選項(xiàng):
(A) HTTPServletRequest類
(B) HTTPServletResponse類
? ServletContext類
(D) Servlet容器
答案: D
總結(jié)
以上是生活随笔為你收集整理的Java Web之自定义JSP标签的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Struts 1 之html标签库
- 下一篇: java的prompt,prompt方法