因爲在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頁面進行轉換的過程中,一旦遇到用戶自定義的標籤便要通過如上三步進行解析並執行該標籤所代表的動作。
四.使用標準標籤庫JSTL(JSP Standard Tag Library)
- 從<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.
庫名稱 | 使用的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 |