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