為了真正實現JSP檔案中不包含任何Scriptlet代碼,還需要通過標籤來解決。標籤分為自定義標籤和開源工具提供的通用標籤。
基本介紹
- 中文名:標籤編程
- 相關詞:JSTL標籤庫
簡介
【示例代碼1】包含Scriptlet代碼的程式。
<table border=”j”width=”j00%”>
<%
int rows=i0;
int cols=10;
for(int X=0;X<rows;x++){
%>
<tr>
<%
for(int Y=0;y<cols;y++){
%>
<td><%=(x*Y)%> </td>
<% }
%>
<%
%>
</table>
本程式使用JSP完成表格的輸出,但是裡面存在過多的Scriptlet代碼,所以這種程式閱讀和修改起來非常麻煩,標籤編程的主要目的就是為了減少頁面中的Scriptlet代碼,使程式更加便於理解和修改。
下面通過一個簡單的程式演示標籤編程,本程式的主要功能依然是在JSP頁面上輸出“Hello World!”的信息。
要想實現一個標籤,可以直接繼承javax.servlet.jsp.tagext.TagSupport類,如果要定義的標籤內沒有標籤體,則直接覆寫TagSupport類中的doStartTag()方法即可。
源檔案名稱稱:HelloTag.java
package org.ixy.tag;
import javax.servlet.Jsp.JspException;
import javax.serv]et.Jsp.JspWriterj
import javax.servlet.Jsp.tagext.TagSupport;
public class HelloTag extends TagSupport{ //繼承標籤支持類TagSupport
public int doStartTag()throws JspException{ //覆寫doStartTag()方法
JspWriter out=super.pageContext.getOut()j //取得頁面輸出流對象
try{
out.println(”<hl>Hello World!</hl>”)j //進行頁面輸出
)catch(Exception e){ //此處產生異常需要處理
e.printStackTrace()j
}
return TagSupport.SKIP—BODY; //沒有標籤體
)
)
在HelloTag類中,首先繼承了TagSupptort標籤支持類,之後覆寫了doStartTag()方法,此方法主要的作用是在標籤起始時進行調用,之後通過TagSupptort中的pageContext屬性,取得了當前頁面的輸出對象,進行頁面的輸出,由於此時開發的標籤沒有任何的標籤體,所以在程式的最後返回的是一個SKIP—BODY的常量,表示不執行標籤體的內容。 一定標籤類定義完成之後,下面就需要編寫標籤描述檔案(Tag Library Descriptor,
TLD),在*.tld檔案中,可以描述標籤的名稱、簡介、處理類和標籤使用到的各個屬性等。
【示例代碼 3】定義標籤描述檔案。
源檔案名稱稱:hellotag.tld
<?xml version:”1.0”encoding=”UTF一8”?>
<taglib xmlns=”http://java.sun.com/】Ⅱni/ns/j2ee”
xmlns:xsi=”http://www.w3.org/200l/XMLSchema—instance’’
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web
version=”2.1’。>
<tlib—version>1.0</tlib—version> <!J sptagl ibrary_2一1.xsd”標籤庫的版本一一>
<tag>
<name>hello</name>
<tag—class>org.ixy.tag.Hel]oTag</tag—class>
<body—content>empty</body—content>
</tag>
</taglib>
<!一一標籤庫在TLD中的描述名稱一一>
<!一一標籤在JSP中的使用名稱一一>
<!一一標籤指向的class檔案一一>
<!一一標籤體內容為空一一>
在hellotag.tld檔案中,詳細地描述了此標籤的版本和支持的JSP版本,其中最重要的是在<tag>元素中定義的<name>元素,表示的是標籤中使用的名稱。每個元素的具體作用如下:
<taglib>:TLD檔案的根元素,其中可以定義多個<tag>元素。
<tlib—version>:標籤庫的版本,用於開發和配置管理。
<short—name;>:一個標籤的短名稱,主要用於標籤的編寫工作。
<tag>:描述標籤庫中的每一個標籤。
<name>:標籤的名稱。
<tag—classY>:標籤處理類的路徑。
<body—content>:表示標籤中是否包含標籤體,如果是empty表示標籤體為空。
編寫完*.tld檔案之後,下面即可通過]SP訪問此標籤,JSP中調用標籤的語法如下:
<%@taglib prefix=”標籤前綴”uri=”TLD檔案路徑”%>
prefix表示的是標籤使用時的前綴,uri表示的是此標籤對應的*.tld檔案的路徑。
源檔案名稱稱:hellotag.jsp
<%@page language=”java”import=”java util.*”pageEncoding=”GBK”%>
<%@taglib prefix=”mytag”uri=”/Web—INF/hellotag.tld”%>
<html>
<head>
<title>My Jsp’hellotag.Jsp‘starting page</title>
</head>
<body>
<hl><mytag:hello/></hl> <!一一訪問標籤一一>
</body>
</html>
在hellotag.jsp頁面中,首先通過<%@taglib%>定義了一個標籤的前綴名稱
“mytag”,之後通過此前綴名稱調用了hellotag.tld檔案中定義的標籤,調用標籤的名稱為
“hello”。程式的運行結果如圖所示。
<taglib>
<taglib—uri>pxxy_hello</taglib—uri>
<taglib—location>/Web—INF/hellotag.tld</taglib—location>
</taglib>
此處將“/Web—INF/hellotag.tld”檔案映射成pxxy—hello名稱,所以在以後所有的JSP
中直接通過pxxy—hello即可訪問此標籤描述檔案。
修改hellotag.jsp,使用映射名稱訪問標籤:
<%@taglib prefix=”mytag”uri=”pxxy hello”%>
此時JSP通過映射名稱訪問標籤描述檔案,以後維護時也更加容易,程式運行結果與上面的一致。
·標籤處理類:HelloTag.java。
·標籤描述檔案:hellotag.tld。
·JSP頁面:通過<%@taglib%>定義標籤。
·在web.xml檔案中配置映射名稱。(可選)
一個標籤的操作中*.tld是一個最重要的檔案,所有標籤的具體信息都要通過此檔案定義,此檔案的導人分兩種情況。當一個JSP頁面第一次運行時,首先會根據JSP檔案編寫的<%@taglib%>中的uri屬性找到對的*.tld檔案,並將其載入到JVM中;而如果是第二次運行此標籤,由於JVM已經存在此*.tld檔案,所以不會再重複載入。
JSTL簡介
JSTL(JSP Standard Tag Library,JSP標準標籤庫)是一個開放原始碼的標籤組件,由
Apaceh的Jakarta小組開發,可以直接從http://tomcat.apache.org/taglibs/上下載。JSTL 1.2版本中主要有如下幾個標籤庫支持,如下所示。