標籤編程

標籤編程

為了真正實現JSP檔案中不包含任何Scriptlet代碼,還需要通過標籤來解決。標籤分為自定義標籤和開源工具提供的通用標籤。

簡介

即便是在MVC設計模式中,僅通過使用EL表達式語言,很多時候JSP頁面還是會存在大量的Scriptlet代碼,為了真正實現JSP檔案中不包含任何Scriptlet代碼,還需要通過標籤來解決。標籤分為自定義標籤和開源工具提供的通用標籤。自定義標籤通過標籤編程來實現,由於標籤編程較難,加上用戶自定義的標籤一般都很繁瑣、不通用,所以實際開發中並不常用,讀者只需要了解基本原理即可。真正在開發中使用的都是各種開源組件中提供。

JSP的開發是在HTML代碼中嵌人大量的Java代碼,但是這樣使得JSP頁面中充滿了Java程式,修改或維護起來非常不方便,例如,下面的代碼中就出現了大量的Scriptlet代碼。
【示例代碼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>
<% }
%>

</tr>
<%
%>
</table>
本程式使用JSP完成表格的輸出,但是裡面存在過多的Scriptlet代碼,所以這種程式閱讀和修改起來非常麻煩,標籤編程的主要目的就是為了減少頁面中的Scriptlet代碼,使程式更加便於理解和修改。
下面通過一個簡單的程式演示標籤編程,本程式的主要功能依然是在JSP頁面上輸出“Hello World!”的信息。
要想實現一個標籤,可以直接繼承javax.servlet.jsp.tagext.TagSupport類,如果要定義的標籤內沒有標籤體,則直接覆寫TagSupport類中的doStartTag()方法即可。

【示例代碼2】定義標籤的操作類。
源檔案名稱稱: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”標籤庫的版本一一>

<short—name>firsttag</short—name>
<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檔案的路徑。

【示例代碼4】標籤測試程式。
源檔案名稱稱: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”。程式的運行結果如圖所示。

運行結果 運行結果

此時,雖然完成了一個標籤的開發,但是也存在一個不足,本案例中的程式是在JSP(hellotag.jsp)中直接找到了標籤描述檔案(hellotag.tld),如果該標籤檔案名稱稱過長,編寫起來會很麻煩,若是更換標籤描述檔案的名稱,修改起來更加麻煩,所以,一般會採取以下方法:在web.xml檔案中對所有的*.tld檔案進行名稱的映射,以後直接在JSP頁面中使用映射名稱即可訪問標籤描述檔案,修改web.xml,映射TLD檔案,如下所示:
<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簡介

使用標籤庫可以避免過多的Scriptlet代碼,但是如果採用自定義的標籤庫做法,會非常繁瑣且不通用,所以開發中一般是藉助於一些開源工具使用一些公共的標籤,JSTI。就是一種使用廣泛的通用標籤。
JSTL(JSP Standard Tag Library,JSP標準標籤庫)是一個開放原始碼的標籤組件,由
Apaceh的Jakarta小組開發,可以直接從http://tomcat.apache.org/taglibs/上下載。JSTL 1.2版本中主要有如下幾個標籤庫支持,如下所示。

標籤庫 標籤庫

JSTL1.2

安裝 安裝

下載的JSTL是以jar包的形式存在的,直接將此jar包保存在Web—INF\lib目錄中,之後可以直接通過WinRAR丁具打開此jar包,並且將其中META—INF資料夾中的幾個主要標籤配置檔案(c.tld、{mt.tld、fn.tld、sql.tld、X.tld)保存在Web—INF資料夾中,如下所示。

此時,即可使用JSTL進行項目開發。

核心標籤庫

JSTI。的核心標籤庫標籤共13個,從功能上可以分為4類:表達式控制標籤、流程控制標籤、循環標籤、Url操作標籤。使用這些標籤能夠完成JSP頁面的基本功能,減少編碼工作。

相關詞條

熱門詞條

聯絡我們