亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

一篇介紹JSP標簽庫很詳細的文章,可以做為參考手冊

2024-09-05 00:20:02
字體:
來源:轉載
供稿:網友

標準的jsp 標記可以調用javabeans組件或者執行客戶的請求,這大大降低了jsp開發的復雜度和維護量。jsp技術也允許你自定義taglib,其實換句話說,taglib可以看成是對jsp標記的一種擴展,正如xml是對html的一種擴展一樣。taglib通常定義在tag標簽庫中,這種標簽庫存放著你自己定義的tag標簽。簡而言之,如果使用taglib,那么你可以設計自己的jsp標記!

一般來說,自定義tag標簽主要用于操作隱藏對象、處理html提交表單、訪問數據庫或其它企業級的服務,諸如郵件和目錄操作等等。自定義tag標簽的使用者一般都是那些對java編程語言非常精通,而且對數據訪問和企業級服務訪問都非常熟悉的程序員,對于html設計者來說,使得他可以不去關注那些較復雜的商業邏輯,而將精力放在網頁設計上。同時,它也將庫開發者和庫使用者進行合理分工,自定義tag標簽將那些重復工作進行封裝,從而大大提高了生產力,而且可以使得tag庫可用于不同的項目中,完美地體現了軟件復用的思想。

在這篇文章中,我們主要討論:

· 什么是自定義tag標簽?

· 怎么使用tag標簽?

o 聲明要使用的tag庫

o 找到與之對應的tag處理類

o tag標簽的類型

· 自定義tag標簽

o tag處理類

o tag庫描述

o tag標簽示例

o 帶屬性的tag

o 帶body的tag

o 定義了腳本變量的tag

o 具有協作關系的tag

· 自定義tag標簽

o 一個迭代tag的例子

o 一個模板tag庫

o tag處理類到底是怎樣被調用的?


什么是自定義的tag?

一個自定義的tag標簽是用戶定義的一種jsp標記。當一個含有自定義的tag標簽的jsp頁面被jsp引擎編譯成servlet時,tag標簽被轉化成了對一個稱為tag處理類的對象進行的操作。于是當jsp頁面被jsp引擎轉化為servlet后,實際上tag標簽被轉化成為了對tag處理類的操作。

自定義tag標簽有很多特色,諸如:

· 可以在jsp頁面中自定義tag標簽的屬性

· 訪問jsp頁面中的所有對象

· 可以動態地修改頁面輸出

· 彼此這間可以相互通信。你可以先創建一個javabeans組件,然后在一個tag中調用此javabeans組件,同時可以在另一個tag中調用它。

· tag允許相互嵌套,可以在一個jsp頁面中完成一些復雜的交互。


使用tag標簽


本節主要描述怎樣在jsp頁面中使用tag標簽,以及tag標簽的不同類型。

要使用tag標簽,jsp程序員必須做2件事:

· 聲明此tag標簽的tag庫

· 實現此tag標簽

聲明tag標簽所在的tag庫

如果要使用tag標簽,則應用jsp的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標簽之前聲明)

<%@ taglib uri=”/web-inf/tutorial-template.tld” prefix=”tt” %>

uri屬性定義了唯一的標簽庫描述(以下簡稱tld),它可以是直接是tld文件名或一個獨一無二的名字。prefix是用來區別其它tld中和本tld中有重名的tag的一種手段。

tld必須以.tld作為擴展名,并且存放在當前應用的web-inf目錄或其子目錄下。你可以通過它的文件名直接引用它,也可以通過別的方式間接地引用它。

以下taglib指示符直接引用一個tld:

<%@ taglib uri=”/web-inf/tutorial-template.tld” prefix=”tt” %>

以下的taglib指示符通過一個邏輯名稱間接地引用一個tld:

<%@ taglib uri=”/tutorial-template” prefix=”tt” %>

如果是間接引用tld的話,那你必須還要在web.xml中定義此邏輯名稱與tld文件之間的映射,具體做法是在web.xml中加入一個名為taglib的元素:

<taglib>

<taglib-uri>/tutorial-template</taglib-uri>

<taglib-location>

/web-inf/tutorial-template.tld

</taglib-location>

</taglib>


實現此tag標簽


為了實現tag標簽,你有2種方法來存放tag處理類。一、讓tag處理類以.class的方式存放于當前應用的web-inf/class子目錄下,二、如果tag處理類是以jar包的形式存在的話,那可以放在當前應用的web-inf/lib目錄下,如果tag處理類要在多個應用中共享,那么它就應放在jsp服務器上的common/lib目錄下,對于tomcat來說,就是tomcat/common/lib目錄下。


tag標簽類型


自定義的tag標簽遵循xml語法。它有一個開始標記和一個結束標記,有的還有body(即文本節點):

<tt:tag>

body

</tt:tag>


一個不帶body的tag標簽如下:

<tt:tag />


簡單的tag標簽

一個沒有body和屬性的tag標簽如下:

<tt:simple />


帶屬性的tag標簽


自定義標簽可以有自己的屬性。屬性一般在開始標記中定義,語法為 attr=”value”。屬性的作用相當于自定義標簽的一個參數,它影響著tag處理類的行為。你可以在tld中詳細定義它。

你可以用一個string常量給一個屬性賦值,也可以通過表達式給它賦值,如<%= ...%>。以struts為例,它的logic:present標簽就是用的string常量來給屬性賦值:

<loglic:present parameter = “clear”>

而另一個標簽logic:iterate是用表達式來給屬性賦值:

<logci:iterate collection=”<%= bookdb.getbooks() %>”

id=”book” type=”database.bookdetails”>


帶body的tag標簽

一個自定義標簽可以包含其它自定義標簽、腳本變量、html標記或其它內容。

在下述例子中,此jsp頁面使用了struts的logic:present標簽,如果些標簽定義了parameter=”clear”的屬性,則將清除購物車的內容,然后打印出一條信息:

<logic:present parameter=”clear”>

<% cart.clear(); %>

<font color=”#ff0000” size=”+2”><strong>

你選擇了清除購物車!

</strong></font>

</logic:present>


到底是用屬性還是用body來傳遞信息?

如上所述,我們既可以通過屬性,也可以通過body來傳遞信息。但一般來說,比較簡單的類型,如字符串或簡單表達式最好采用屬性來傳遞信息。


定義腳本變量的tag標簽

所謂腳本變量,是指jsp中可以調用的變量或對象。它可由tag標簽產生。以下示例闡述了一個tag標簽定義了一個名為tx的由jndi所定義的事務處理對象。腳本變量可以是ejb對象、事務、數據庫連接等等:

<tt:lookup id=”tx” type=”usertransaction” name=”java:comp/usertransaction” />

<% tx.begin(); %>

...


具有協作關系的tag標簽

自定義tag標簽之間可以通過共享對象來實現協作。在下述例子中,標簽tag1創建了一個名為obj1的對象,在標簽tag2仍可以重復使用obj。

<tt:tag1 attr1=”obj1” value1=”value” />

<tt:tag2 attr1=”obj1” />

在以下這個例子當中,如果外層的tag標簽創建了一個對象,那么其內層的所有tag標簽都可以使用這個對象。由于這樣產生的對象沒有一個指定的名字,那么就可以將少重名的沖突。這個例子闡述了一系列協作的嵌套對象。

<tt:outertag>

<tt:innertag />

</tt:outertag>

tag處理類


tag處理類必須實現tag接口或bodytag接口,不過現在一般都流行從tagsupport或bodytagsupport類中繼承,這些類或接口都可以在javax.servlet.jsp.tagext包中找到。

當jsp引擎看到自己的jsp頁面中包含有tag標簽時,它會調用dostarttag方法來處理tag標簽的開頭,調用doendtag方法來處理tag標簽的結束。

下表說明不同類型的tag所需要不同的處理過程:

tag處理類的方法

tag標簽類型
所調用的方法

基本標簽
dostarttag, doendtag, release

帶屬性的標簽
dostarttag, doendtag, set/getattribute1...n, release

帶內容的標簽
dostarttag, doendtag, release

帶內容的標簽,且內容重復循環
dostarttag, doafterbody, doendtag, release

帶內容的標簽,且內容與jsp交互
dostarttag, doendtag, release, doinitbody, doafterbody, release

一個tag處理類可以通過javax.servlet.jsp.pagecontext來與jsp交互,通過javax.servlet.jsp.pagecontext類,tag處理類可以訪問jsp中的request、session和application對像。

如果tag標簽是互相嵌套的,那內層的tag處理類可以通過它的parent屬性來訪問上層的tag處理類。

一般情況都將所有的tag處理類打成了jar的包,以便于發布。


tag庫描述(簡稱tld)


tag庫是用xml語言描述的,tld包括了tag庫中所有tag標簽的描述,它一般用來被jsp服務器用來校驗tag的語法正確性,或者被jsp開發者用來開發新的標簽。

tld的文件擴展名必須為.tld,而且必須放在當前web應用的web-inf目錄或其子目錄中。

一個tld的內容的開頭必須遵守標準的xml開頭,用于描述dtd和xml的版本,例如:

<?xml version="1.0" encoding="iso-8859-1" ?>

<!doctype taglib public "-//sun microsystems, inc.//dtd jsp tag library 1.2//en" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
tld必須以<taglib>來作為它的根元素,<taglib>的子元素如下表:


<taglib>的子元素

element
description

tlib-version
tag庫的版本

jsp-version
tag庫所需要的jsp的版本

short-name
助記符,tag的一個別名(可選)

uri
用于確定一個唯一的tag庫

display-name
被可視化工具(諸如jbuilder)用來顯示的名稱(可選)

small-icon
被可視化工具(諸如jbuilder)用來顯示的小圖標(可選)

large-icon
被可視化工具(諸如jbuilder)用來顯示的大圖標(可選)

description
對tag庫的描述(可選)

listener
參見下面listener元素

tag
參見下面tag 元素

listener元素

一個tag庫可能定義一些類做為它的事件偵聽類,這些類在tld中被稱為listener 元素,jsp服務器將會實例化這些偵聽類,并且注冊它們。listener元素中有一個叫listener-class的子元素,這個元素的值必須是該偵聽類的完整類名。

tag元素

每個tag元素在tag庫中都要指出它的名字、類名、腳本變量、tag的屬性。其中腳本變量的值可以直接在tld中定義或通過tag附加信息的類來取得。每個屬性描述了這個屬性是否可以省略,它的值是否可以通過<%= …%>這樣的jsp語法來獲得,以及屬性的類型。

每一個tag在tld中對應一個tag元素,下表是tag元素的子元素:

tag元素的子元素

元素名稱
描述

name
獨一無二的元素名

tag-class
tag標簽對應的tag處理類

tei-class
javax.servlet.jsp.tagext.tagextrainfo的子類,用于表達腳本變量(可選)

body-content
tag標簽body的類型

display-name
被可視化工具(諸如jbuilder)用來顯示的名稱(可選)

small-icon
被可視化工具(諸如jbuilder)用來顯示的小圖標(可選)

large-icon
被可視化工具(諸如jbuilder)用來顯示的大圖標(可選)

description
此tag標簽的描述

variable
提供腳本變量的信息(同tei-class)(可選)

attribute
tag標簽的屬性名

以下章節介紹對于不同類型的tag,如何具體地實現它們。


簡單的tag


tag處理類

簡單的tag處理類必須實現tag接口的dostarttag和doendtag方法。當jsp引擎碰到tag標簽的開頭時,dostarttag被調用,因為簡單的tag沒有body,所以此方法將返回 skip_body。當jsp引擎碰到tag標簽的結尾時,doendtag被調用,如果余下的頁面還要被計算,那它將返回eval_page,否則將會返回skip_page。

以下是例子:對于標簽 <tt:simple /> ,它的tag處理類實現如下:


public simpletag extends tagsupport

{

public int dostarttag() throws jspexception

{

try{

pagecontext.getout().print(“hello.”);

}catch(exception e){

throw new jsptagexception(“simpletag: “ + e.getmessage());

}

return skip_body;

}

public int doendtag()

{

return eval_page;

}

}


注意:如果tag標簽沒有內容的話,那必須定義body-content元素為空,例如

<body-content>empty</body-content>


帶屬性的tag標簽


tag處理類

對于tag標簽的每個屬性,你必須依照javabeans規范來定義其屬性,以及get和set方法。以struts的logic:present 標簽為例,

<logic:present parameter=”clear”>

與此相應,此tag處理類應有如下方法和定義:


protected string parameter = null;

public string getparameter()

{

return this.parameter;

}

public void setparameter(string parameter)

{

this.parameter = parameter;

}


注意:如果你的屬性名為id,而且你的tag處理類是從tagsupport類繼承的,那你就不需要定義它的屬性和set和get方法,因為他們早已在tagsupport被定義過了。

attribute元素

對于tag標簽的每個屬性,你必須定義它是否必須的,它的值是否可以用諸如<%= …%>的表達式來獲得,以及它的類型(可選),如果不指定它的類型,那就默認為是java.lang.string類型。如果rtexprvalue元素被定義為true或yes,那么在type元素中就定義了attribute的返回類型。

<attribute>

<name>attr1</name>

<required>true|false|yes|no</required>

<rtexprvalue>true|false|yes|no</rtexprvalue>

<type>attribute的返回類型(只用當rtexprvalue為真是才有效)</type>

</attribute>

如果tag的某個屬性不是必須的,那tag處理類會自動提供一個缺省值。

例如,在logic:present這個tag標簽中定義了一個屬性叫parameter,但它不是必須的,而且它可以被諸如<%= …%>的表達式來賦值。

<tag>

<name>present</name>

<tag-class>org.apache.struts.taglib.logic.presenttag</tag-class>

<body-content>jsp</body-content>

<attribute>

<name>parameter</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>


屬性元素的校驗


有關于tag標簽的有效值可以從tag庫的說明文檔中獲得,當jsp頁面被編譯時,jsp引擎會強制性地參照tld中定義的規則進行檢查。

還有一個方法也可以進行屬性元素的校驗,就是先繼承類tagextrainfo,然后調用它的isvalid方法。這個類同時也起到提供tag中定義的腳本變量信息的作用。

isvalid方法通過tagdata對象來傳遞屬性信息,它包括著tag的所有的屬性名-值的信息。由于校驗發生在運行時刻,因此這個屬性的值將被賦值為tagdata.request_time_value。

例如tag標簽<tt:twa attr1=”value1” />在tld中定義如下:

<attribute>

<name>attr1</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>


這個定義說明了attr1能在運行期間被賦值。

以下的isvalid方法檢查attr1屬性的值是否屬于boolean類型。注意由于attr1能在運行刻被賦值,那么isvalid方法必須檢查tag用戶是否對此tag進行了運行時刻賦值。


public class twatei extends tagextrainfo

{

public boolean isvalid(tagdata data)

{

object o = data.getattribute(“attr1”);

if(o != null && o != tagdata.request_time_value)

{

if( ( (string)o).tolowercase().equals(“true”) || 

((string)o).tolowercase().equals(“false”) )

return true;

else

return false;

}

else

return true;

}

}

帶body的tag

tag處理類


如果tag標簽含有內容,那處理方式會略微有些不同,而且還要視tag處理類是否要與body交互的情況而定。如果要與body交互,那我們認為tag處理類要可能要對body進行操作。

tag處理類不與body交互

如果tag處理類不與body交互,tag處理類應該實現tag接口或從tagsupport中派生,如果body要被計算,那么dostarttag方法應返回 eval_body_include,否則應返回skip_body。

如果tag處理類要對body反復運算,則它應該實現iterationtag或從tagsupport中派生。如果tag處理類認為body還未計算完的話,那它的dostarttag方法和doafterbody方法必須返回eval_body_again。

tag處理類與body交互

如果tag處理類與body交互,那tag處理類應實現bodytag接口或從bodytagsupport中派生。這種tag處理類一般要實現doinitbody和doafterbody方法。

body允許一些方法來讀寫它的內容。tag處理類可以調用body內容的getstring或getreader方法來從body中提取信息,也可用 writeout(out) 方法來將body的內容寫入到out對象中。其中out對象通過tag處理類的getpreviousout方法來獲得。

如果body的內容需要被計算,那么dostarttag方法必須返回eval_body_buffered,否則,它將返回 skip_body。

doinitbody 方法

此方法在body內容已經設好,但未被計算之前被調用。你可以根據不同的body內容來制定初始化策略。

doafterbody方法

此方法在body內容已被計算后進行調用。

和dostarttag方法一樣,doafterbody方法返回一個指示符指示是否要繼續計算body,如果要繼續計算,則doafterbody應返回eval_body_buffered,否則,它應返回skip_body。

release 方法

tag處理類調用此方法將它的狀態重置為初始狀態,并釋放所有的私有資源。


以下的例子讀取body的內容(其中含有一條sql語句),然后將它傳遞給一個對象,讓它進行查詢。由于此處body不須重新計算,所以doafterbody會返回skip_body。


public class querytag extends bodytagsupport

{

public int doafterbody() throws jsptagexception

{

bodycontent bc = getbodycontent();

//將body的內容以字符串的格式提取出來

string query = bc.getstring();

//清除body

bc.clearbody();

try{

statement stmt = connection.createstatement();

result result = stmt.executequery(query);

}catch(sqlexception e){

throw new jsptagexception(“querytag: “ + e.getmessage() );

return skip_body;

}

}


body-content元素


由于tag可能會有body,你必須用body-content元素來指定body內容的類型:

<body-content>jsp|tagdependent</body-content>


如果body的內容是定制的或內部的tag、腳本元素、或html廣本,則歸類為jsp類型。其他的類型,比如上面代碼所述的?d?d將sql statement類傳給 query tag的這種類型應該標為tagdependent。

注意:實際上body-content的值并不影響tag處理類對body內容的處理,它僅僅是被tag編輯工具用來描述此body的內容。


用tags定義腳本變量

tag處理類


tag處理類負責創建或設置頁面中定義的腳本變量,用pagecontext.setattribute(name,value,scope)或pagecontext.setattribute(name,value)方法來實現。一般來說,tag處理類通過腳本變量的名稱來獲取它,腳本變量的名稱一般可用get方法來獲得。

如果腳本變量的值依賴于tag處理類中的上下文中某一對象,那它可用pagecontext.getattribute(name,scope)方法來找到那個對象。一般的處理過程是tag處理類先找到腳本變量,再對其進行處理,然后用pagecontext.setattribute(name,object)的方法來設置它的新值。

對象的生存周期(scope)如下表:

對象的生存周期表

名字
可訪問范圍
生存周期

page
當前頁面
一直有效,除非頁面向客戶提交響應或重定向到一個新頁面

request
當前頁面或當前頁面重定向到的頁面
一直有效,除非頁面向客戶提交響應

session
當前頁面或在同一瀏覽器窗口中的頁面
一直有效,除非關閉當前瀏覽器、超時、網絡故障

application
整個web應用程序的所有請求
一直有效,除非發生網絡故障、服務器故障

提供關于腳本變量的信息

以下示例定義了一個名為“book”的腳本變量,用來訪問程序中關于書的信息:

<bean:define id=”book” name=”bookdb” property=”bookdetails” type=”database.bookdetails” />

<font color=”red” size=”+2” >

<%= messages.getstring(“cartremoved”) %>

<strong><jsp:getproperty name=”book” property=”title” /></strong>

</font>

當包含此tag的jsp頁面被編譯時,jsp引擎會自動生成關于此book的同步的代碼(同步可以避免幾個客戶同時訪問此book時造成的沖突),要生成同步代碼,jsp引擎需要知道此腳本變量的如下信息:

· 腳本變量名稱

· 腳本變量所屬的類

· 此腳本變量是否引用了一個新的或已存在的對象

· 此腳本變量的有效性

有兩種辦法可以向jsp引擎提供關于腳本變量的信息:在tld中定義variable子元素,或用tei-class子元素定義一個額外tag信息類。用variable最簡單,但可能降低了一些靈活性。

variable元素

variable元素有如下子元素:

· name-given ?d?d 給出的名字,是一個常量

· name-from-attribute?d?d 屬性名,在編譯時給出的屬性名

name-given或name-from-attribute兩者必須選一,但以下子元素是可選的:

· variable-class?d?d變量的類型,缺省為java.lang.string。

· declare?d?d此腳本變量是否引用了一個新對象,缺省為true。

· scope?d?d腳本變量的范圍,缺省為nested。下表描述了scope的幾種類型:

腳本變量的有效范圍


有效性
方法

nested
在tag標簽的開始和結束之間
如果tag處理類實現bodytag接口,則在doinitbody和doafterbody中調用,否則在dostarttag中調用

at_begin
從tag標簽的開始一直到頁面結束
如果tag處理類實現bodytag接口,則在doinitbody、doafterbody和doendtag中調用,否則在dostarttag和doendtag中調用

at_end
從tag標簽的結束一直到頁面結束
在doendtag中調用

以struts為例,它的bean:define標簽的實現遵循jsp1.1規范,此規范要求使用額外tag信息類來定義腳本變量。variable元素是jsp1.2規范中加入的。以bean:define標簽為例,你可以定義如下variable元素:

<tag>

<variable>

<name-from-attribute>id</name-from-attribute>

<variable-class>database.bookdetails</variable-class>

<declare>true</declare>

<scope>at_begin</scope>

</variable>

</tag>

額外tag信息類

如果要定義一個額外tag信息類,你要繼承javax.servlet.jsp.tagextrainfo類。一個tagextrainfo類必須實現getvariableinfo方法,此方法返回一個叫variableinfo的數組類,它包括如下信息:

· 變量名

· 變量所屬類名

· 此變量是否引用了一個新對象

· 此變量的有效范圍

jsp引擎將一個名為data的參數傳給getvariableinfo方法,data中包括tag標簽中的所有“屬性名?d?d屬性值”對。它可以用來向variableinfo對象提供腳本變量的名字和類名。

以struts為例,它在bean:define標簽中定義了一個名為definetei的額外tag信息類,用來向腳本變量提供信息。由于腳本變量的名稱(book)和類名(database.bookdetails)是通過tag標簽的屬性來傳遞的,它們一般定義在variableinfo的構建代碼中,并且可用data.getattributestring方法來得到這些信息。如果要允許book腳本變量能在從tag開始直到整個jsp頁面結束的范圍內都可用的話,那它的范圍應設為at_begin。如下所示:


public class definetei extends tagextrainfo

{

public variableinfo[] getvariableinfo(tagdata data)

{

string type = data.getattributestring(“type”);

if( type == null)

type = “java.lang.object”;

return new variableinfo[] {

new variableinfo(data.getattributestring(“id”), 

type,

true,

variableinfo.at_begin)

};

}

}


注意:關于額外tag信息類的類名必須要在tld中的tag標簽下的tei-class子元素中定義。因此,definetei的tei-class中的定義看起來如下:
<tei-class>
org.apache.struts.taglib.bean.definetagtei
</tei-class>


具有協作關系的tag


tag通過共享對象來進行協作,jsp技術支持2種方式的對象共享。

第一種方法是使用pagecontext對象進行對象的共享(可支持jsp頁面和tag處理類之間的共享),如果在一個tag處理類中要調用由另一個tag處理類創建的對象,可調用pagecontext.getattribute(name, scope)方法。

第二各方式的共享是對于tag之間有嵌套關系而言的,外層的tag所創建的對象對于內層的tag來說是可以共用的。這種形式的共享的好處是減少了可能存在的重名沖突。

要訪問一個嵌套tag創建的對象,tag處理類必須先找到此嵌套tag對象,可用tagsupport的靜態方法 tagsupport.findancestorwithclass(from, class)或tagsupport.getparent方法。前者在當不確定此tag是否為嵌套tag對象時使用。一旦它的父類被找到,它就能訪問其所有動態或靜態創建的對象。靜態創建的對象是父類的成員,而動態創建的對象可能是父類的私有對象。諸如此類的對象可以用tag處理類的setvalue方法來保存,用getvalue方法來獲得。

下例闡述了以上兩種共享對象的方法。在這個例子當中,一個查詢tag檢查一個名為connection的屬性名是否在dostarttag中被設置。如果connection屬性被設置,tag處理類從pagecontext中得到這個connection對象。否則,此tag處理類先找到它的父tag處理類,然后從它的父tag處理類中找到connection對象。


public class querytag extends bodytagsupport

{

private string connectionid;

public int dostarttag() throws jspexception

{

string cid = getconnection();

if(cid != null)

{

//存在一個connection id,使用它。

connection = (connection) pagecontext.getattribute(cid);

}

else

{

connectiontag ancestortag = (connectiontag)findancestorwithclass(this, 

connectiontag.class);

if(ancestortag == null)

{

throw new jsptagexception(“一個沒有connection屬性的查詢標簽必須被一個connection標記嵌套?!?;

}

connection = ancestortag.getconnection();

}

}


此查詢標簽在jsp頁面中的調用形式可以從以下2種定義中任選一種:

<tt:connection id=”con01” ...> ... </tt:connection>

<tt:query id=”balances” connection=”con01” >

select account, balance from acct_table

where customer_num = <%= request.getcustno() %>

</tt:query>

<tt:connection ...>

<x:query id=”balances”>

select account, balance from acct_table

where customer_num = <%= request.getcustno() %>

</x:query>

</tt:connection>

與此同時,在tld中必須指定connection屬性為可選的,定義如下:

<tag>

...

<attribute>

<name>connection</name>

<required>false</required>

</attribute>

</tag>

菜鳥學堂:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩亚洲精品| 国产在线98福利播放视频| 欧美久久精品午夜青青大伊人| 成人黄色激情网| 91精品国产自产91精品| 国内精品久久久久久久| 中文字幕在线亚洲| 亚洲影影院av| 久久久精品一区二区| 欧美高跟鞋交xxxxxhd| 久久成人亚洲精品| 亚洲女人被黑人巨大进入| 日韩免费在线播放| 最好看的2019的中文字幕视频| 九九热这里只有精品6| 91地址最新发布| 中文字幕日韩av综合精品| 久久久女人电视剧免费播放下载| 亚洲r级在线观看| 国产在线一区二区三区| 97视频网站入口| 欧美一区二区三区免费视| 在线看福利67194| 日韩麻豆第一页| 91精品国产综合久久久久久久久| 在线播放国产精品| 国产精品91久久| 在线日韩av观看| 91在线免费视频| 色综合久久天天综线观看| 日韩在线一区二区三区免费视频| 日本欧美黄网站| 日韩成人在线电影网| 国产精品国产三级国产aⅴ9色| 国产亚洲激情在线| 国产精品三级美女白浆呻吟| 国产在线观看不卡| 韩曰欧美视频免费观看| 日韩视频免费中文字幕| 国产欧美一区二区三区久久人妖| 国产成人+综合亚洲+天堂| 国产精品久久久91| 中文字幕国产亚洲2019| 亚洲精品99久久久久中文字幕| 日韩av在线资源| 成人激情视频免费在线| 亚洲欧洲偷拍精品| 亚洲综合在线小说| 伊人伊成久久人综合网小说| 日韩成人在线播放| 中文字幕亚洲欧美日韩在线不卡| 午夜精品久久久久久99热| 国产精品一区专区欧美日韩| 日韩最新av在线| 成人国产精品色哟哟| 在线亚洲男人天堂| 狠狠躁夜夜躁人人爽超碰91| 九九精品在线视频| 亚洲人成啪啪网站| 日本三级久久久| 亚洲欧美日韩成人| 亚洲天堂免费观看| 久久精品国产欧美激情| 777777777亚洲妇女| 欧美电影在线播放| 日韩av一区二区在线观看| 久久久999精品免费| 国模gogo一区二区大胆私拍| 亚洲精品aⅴ中文字幕乱码| 亚洲网站在线播放| 欧美激情视频在线免费观看 欧美视频免费一| 欧美极品欧美精品欧美视频| 成人黄色在线观看| 国产精品视频永久免费播放| 亚洲美女av在线播放| 亚洲国产婷婷香蕉久久久久久| 国产原创欧美精品| 欧美肥老妇视频| 日韩禁在线播放| 国产91色在线播放| 91久久久亚洲精品| 亚洲一区二区少妇| 国产精品第三页| 久久在线观看视频| 欧美中文在线观看| 亚洲精品欧美极品| 97香蕉超级碰碰久久免费的优势| 九九精品在线视频| 92版电视剧仙鹤神针在线观看| 国产欧美精品一区二区三区-老狼| 亚洲人成欧美中文字幕| 国产精品入口免费视频一| 日日骚av一区| 中文字幕亚洲一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩电影中文字幕在线观看| 曰本色欧美视频在线| 97国产精品人人爽人人做| 国产精品极品美女粉嫩高清在线| 日韩中文字幕不卡视频| 亚洲级视频在线观看免费1级| yw.139尤物在线精品视频| 日韩精品在线免费观看| 亚洲欧美国产另类| 亚洲一区二区三区四区视频| 国产精品一区久久| 国产丝袜精品第一页| 国产视频观看一区| 国产精品三级在线| 久久69精品久久久久久国产越南| 亚洲精品国产综合区久久久久久久| 91国产精品电影| 欧美日韩国产91| 欧美黑人xxx| 国产精品福利在线观看| 久久精品一区中文字幕| 久久久亚洲精品视频| 国产一区二区黑人欧美xxxx| 91香蕉嫩草神马影院在线观看| 国产欧美一区二区三区在线看| 国产伦精品一区二区三区精品视频| 亚洲精品98久久久久久中文字幕| 欧美精品激情blacked18| 亚洲国产美女久久久久| 成人444kkkk在线观看| 91免费视频网站| 欧美日韩免费网站| 国产精品mp4| 日韩美女视频免费看| 亚洲国产精品中文| 亚洲a一级视频| 欧美高清视频免费观看| 亚洲欧美激情在线视频| 久久99久国产精品黄毛片入口| 欧美精品在线播放| 欧美色videos| 777国产偷窥盗摄精品视频| 中文国产亚洲喷潮| 欧美黄色性视频| 国产精品高清在线| 97视频在线观看视频免费视频| 国产精品自拍视频| 成人看片人aa| 日韩精品视频免费| 69精品小视频| 97国产在线视频| 精品国产福利视频| 日韩欧美在线视频观看| 欧美综合第一页| 亚洲成人精品视频| 欧美最猛性xxxxx(亚洲精品)| 欧美黄色小视频| 亚洲人成在线电影| 色婷婷成人综合| 91精品国产综合久久香蕉的用户体验| 国产精品久久久久久一区二区| 成人a在线观看| 亚洲成av人影院在线观看| 欧美在线视频在线播放完整版免费观看| 77777亚洲午夜久久多人| 日本一区二区在线免费播放| 日本久久亚洲电影| 欧美精品中文字幕一区| 国产一区二区欧美日韩|