複製鏈接
請複製以下鏈接發送給好友

標籤編程

鎖定
為了真正實現JSP文件中不包含任何Scriptlet代碼,還需要通過標籤來解決。標籤分為自定義標籤和開源工具提供的通用標籤。
中文名
標籤編程
相關詞
JSTL標籤庫

標籤編程簡介

即便是在MVC設計模式中,僅通過使用EL表達式語言,很多時候JSP頁面還是會存在大量的Scriptlet代碼,為了真正實現JSP文件中不包含任何Scriptlet代碼,還需要通過標籤來解決。標籤分為自定義標籤和開源工具提供的通用標籤。自定義標籤通過標籤編程來實現,由於標籤編程較難,加上用户自定義的標籤一般都很繁瑣、不通用,所以實際開發中並不常用,讀者只需要瞭解基本原理即可。真正在開發中使用的都是各種開源組件中提供。
JSP的開發是在HTML代碼中嵌人大量的Java代碼,但是這樣使得JSP頁面中充滿了Java程序,修改或維護起來非常不方便,例如,下面的代碼中就出現了大量的Scriptlet代碼。
【示例代碼1】包含Scriptlet代碼的程序。
<%
int rows=i0;
int cols=10;
for(int X=0;X
%>
<%
for(int Y=0;y
%>
<% }
%>
<%
%>
<%=(x*Y)%>
本程序使用JSP完成表格的輸出,但是裏面存在過多的Scriptlet代碼,所以這種程序閲讀和修改起來非常麻煩,標籤編程的主要目的就是為了減少頁面中的Scriptlet代碼,使程序更加便於理解和修改。
下面通過一個簡單的程序演示標籤編程,本程序的主要功能依然是在JSP頁面上輸出“Hello World!”的信息。
要想實現一個標籤,可以直接繼承javax.servlet.jsp.tagext.TagSupport類,如果要定義的標籤內沒有標籤體,則直接覆寫TagSupport類中的doStartTag()方法即可。 [1] 
【示例代碼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(”Hello World!”)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
xmlns:xsi=”http://www.w3.org/200l/XMLSchema—instance’’
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web
version=”2.1’。>
1.0
firsttag
hello
org.ixy.tag.Hel]oTag
empty
在hellotag.tld文件中,詳細地描述了此標籤的版本和支持的JSP版本,其中最重要的是在元素中定義的元素,表示的是標籤中使用的名稱。每個元素的具體作用如下:
:TLD文件的根元素,其中可以定義多個元素。
:標籤庫的版本,用於開發和配置管理。
:一個標籤的短名稱,主要用於標籤的編寫工作。
:描述標籤庫中的每一個標籤。
:標籤的名稱。
:標籤處理類的路徑。
:表示標籤中是否包含標籤體,如果是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”%>
My Jsp’hellotag.Jsp‘starting page
在hellotag.jsp頁面中,首先通過<%@taglib%>定義了一個標籤的前綴名稱
“mytag”,之後通過此前綴名稱調用了hellotag.tld文件中定義的標籤,調用標籤的名稱為
“hello”。程序的運行結果如圖1所示。
圖1 運行結果 圖1 運行結果
此時,雖然完成了一個標籤的開發,但是也存在一個不足,本案例中的程序是在JSP(hellotag.jsp)中直接找到了標籤描述文件(hellotag.tld),如果該標籤文件名稱過長,編寫起來會很麻煩,若是更換標籤描述文件的名稱,修改起來更加麻煩,所以,一般會採取以下方法:在web.xml文件中對所有的*.tld文件進行名稱的映射,以後直接在JSP頁面中使用映射名稱即可訪問標籤描述文件,修改web.xml,映射TLD文件,如下所示:
pxxy_hello
/Web—INF/hellotag.tld
此處將“/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文件,所以不會再重複加載。 [2] 

標籤編程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頁面的基本功能,減少編碼工作。 [1] 
參考資料