Java Web基礎——自定義標籤和JSTL

因爲在Struts2中使用到了很多該框架的自定義標籤的使用,所以在此特別梳理了一下有關的知識體系


標籤(動作)的一般語法爲:<prefix:標籤名 屬性表列>,如<jsp:include page="copyright.jsp" />,該標籤的作用是把copyright.jsp頁面的輸出包含到當前頁面的輸出中

我們先來看一下常用的標準JSP動作動作指令,又可以叫做標籤指令:

  • jsp:include 在當前頁面包含另一個頁面的輸出
  • jsp:forward 將請求轉發到指定的頁面
  • jsp:usebean 查找或者創建一個JavaBeans對象
  • jsp:setProperty 設置JavaBeans的屬性值
  • jsp:getProperty 返回JavaBeans的屬性值
  • jsp:plugin 在JSP頁面嵌入一個插件(如Applet)

以上的這些標準標籤是JSP中內置的,所以不需要特別的生命便可使用。當然我們也可以根據需要定義自定義標籤以實現特定的效果,下面我將系統的介紹自定義標籤的創建和使用流程:


所謂自定義標籤就是用Java語言開發的程序的,以特定的格式在JSP頁面中使用的標籤,自定義標籤又被叫做自定義動作(Custom Action)。

我們這裏主要介紹如何利用JSP2.0中的擴展標籤API進行開發,而不再介紹傳統JSP1.x中標籤的開發,JSP2.0中簡單的自定義標籤開發更加簡潔和使用。



一.簡單自定義標籤API的層次結構

標籤類層次結構
  • Jsp接口是一個接口,該接口沒有定義任何方法,只起到接口表示和類型安全的作用
  • SimpleTag接口用來實現結點的自定義標籤,接口中定義了5個生命週期方法,下面我們會詳細介紹
  • SimpleTagSupport類實現了SimpleTag接口,並且還定義了另外三個方法



二.自定義標籤的開發步驟

  • 創建標籤處理類
  • 創建標籤庫描述文件TLD(Tag Library Discriptor)
  • 在JSP頁面中引入標籤庫和使用標籤

下面我們將創建使用一個實現將標籤體打印五次的自定義標籤,並在之後說明其相關原理。

標籤處理類

public class HelloTag implements SimpleTag {

	JspContext context = null;
	JspTag parent = null;
	JspFragment jspBody = null;
	
	@Override
	public void doTag() throws JspException, IOException {
		StringWriter sw = new StringWriter();
		jspBody.invoke(sw);
		String bodyContent = sw.toString();
		JspWriter out = context.getOut();
		for(int i=0;i<5;i++){
			out.println(bodyContent);
		}
	}
	@Override
	public JspTag getParent() {
		return parent;
	}
	@Override
	public void setJspBody(JspFragment jspBody) {
                this.jspBody=jspBody;
        }
	@Override
	public void setJspContext(JspContext jspContext) {
		context = jspContext;
	}
	@Override
	public void setParent(JspTag parent) {
		this.parent = parent;
	}
}

標籤庫描述文件 sampleLib.tld,放在WEB-INF或者其子文件夾中

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
	version="2.0">
	<tlib-version>2.0</tlib-version>
	
	<short-name>hello</short-name>
	<uri>/testPath</uri>
	
	<tag>
		<name>hello</name>
		<tag-class>com.mytream.HelloTag</tag-class>
		<body-content>scriptless</body-content>
	</tag>
</taglib>


在JSP頁面中使用該標籤

hello.jsp

<%@ page contentType="text/html" %>
<%@ taglib prefix="test"  uri="/testPath" %>
<html>
  <head>
    <title>Test Custom Tag</title>
  </head>
  <body>
    	<test:hello>good</test:hello>
  </body>
</html>

訪問hello.jsp頁面,我們將會看到good被連續打印了5遍,這是我們在doTag()方法中所做的操作,當然該標籤的解析過程要比這複雜的多,下面我講一一介紹。



三.容器解析自定義標籤的過程

解析自定義標籤流程圖
上圖不一定符合UML規範,僅僅是爲了幫助理解。從上圖我們可以看到tomcat容器在對JSP頁面進行轉換的過程中,一旦遇到用戶自定義的標籤便要通過如上三步進行解析並執行該標籤所代表的動作。
1.通過標籤的前綴找到該標籤所對應的uri,該uri並不表示資源的具體位置,而是通過它可以建立與TLD文件中所定義標籤的映射。在WEB-INF/下的TLD文件中找到<tag>標籤中的<name>對應的<tag-class>,
也就是需要創建的類的對象的名字。利用反射機制創建HelloTag的示例
2.調用HelloTag的setXXX()方法,根據JSP頁面中屬性對應的值對HelloTag對象的屬性值進行設置,這樣我們就可以在自己定義的這些類中使用這些屬性值了
3.調用HelloTag的doTag()方法,執行用戶定義的相關操作



四.使用標準標籤庫JSTL(JSP Standard Tag Library)

既然我們能夠自定義標籤,我們當然也能夠使用已經定義好的其他好的標籤。
JSTL爲我們提供了龐大的標籤庫,使用JSTL可以提高開發的效率,參考之前自定義標籤的操作,要使用JSTL標籤要進行如下操作:
  • 從<CATALINA_HOME>\webapps\examples\WEB-INF\lib中將jstl.jar和standard.jar文件複製到自己的項目中的WEB-INF\lib目錄中
  • 在使用JSTL標籤前進行聲明,即用taglib指令來引用標籤庫,如<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 使用,如<C:out value="Welcome to using JSTL" />將會輸出Welcome to using JSTL.
JSTL相當龐大,共提供了5個庫,如下表所示
JSTL庫及使用的URI與前綴
庫名稱 使用的URI 前綴
核心標籤庫 http://java.sun.com/jsp/jstl/core c
XML標籤庫 http://java.sun.com/jsp/jstl/xml x
國際化和格式化庫 http://java.sun.com/jsp/jstl/fmt fmt
SQL標籤庫 http://java.sun.com/jsp/jstl/sql sql
函數庫 http://java.sun.com/jsp/jstl/functions fn









至於如何使用JSTL標籤庫,有太多的參考資料了,暫時不再列敘














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章