2004-12-03
JSP/XML/JSTL
Jsp
和
xml
的合作
l????????
方式
1
:
第一個大的趨勢就是以
XML
技術為前端顯示層或者是后端數據層
JSP/JMS/Servlet/EJB
等
J2EE
技術為中間處理層
。
XML
技術充當數據層
l????????
JSP
技術與
XML
技術集成的另一個趨勢就是所謂的
Tag Libraries
在
JSP
程序中的大規
模應用。
Jsp taglib
Tag
引用:
JSP
程序的運行原理根據
JSP1.2
規范的描述
JSP
程序的運行可以分為這樣的幾個步驟:
1、parsing,即jsp進行xml化,如:
??????
將會被替換為
2
、
validation,
驗證自定義
tag
是否存在
3
、
translation,
被翻譯為一個
servlet
類
à
HttpJspPage
à
JspPage
à
Servlet(
à
表示繼承
)
4
、
excution,
編譯執行。
taglib
編寫:
第一步:建立
tag
文件:建立一個
tag.
第二步:設計
tag
的各種屬性。
第三步:編寫
tagclass
和
teiclass
第四步:編寫
jsp
測試。
Jsp tld
文件標志介紹:
1、?
jstl
是支持事件的,可以編寫
listener,
定義在
taglib
部分。
2、?
tag
標記中的
teiclass
:
指定此
Tag
的
TagExtraInfo
類
tei
即是
Tag Extra Info
三個打頭字母的縮寫利用
TagExtraInfo
類
(
基類為
javax.servlet.jsp.tagext.TagExtraInfo
實際中必須覆蓋這個類
)
可以獲取一些關于
Tag
的額外信息
3、??
bodycontent:
bodycontent
指定在
Tag
對之間可以包含的內容的類型比如在
標記與
標記與
標記之間可以包含哪些類型的內容這是由
bodycontent
決定的
bodycontent
可以取以下值
tagdependent, JSP, empty.
4、??
tagdependent
標記體內的內容將被送到
Tag Handler
中賦給
Tag
標記體內的內容可以為空。
5、?
JSP
標記體內的內容可以是
JSP
代碼段也可以是普通的文本用于往客戶端輸出也可以是空值
6、??
empty
標記體內不能含有任何內容
7、??
rtexprvalue
指定
Tag
某個屬性的值是否可以通過
JSP
代碼段動態生成可以使用的值為
false true yes no
缺省值為
false
在本例中
jspFile
的值可以由
JSP
代碼動態生成。
8、?
attribute
的
type
指定
Tag
某個屬性的
Java
類型,
缺省值為
java.lang.String
。
9
、
jsptag
可以引起循環。
tag
執行過程介紹:
1、??
doStartTag()
l????????
EVAL_BODY_TAG
其意義是使得
JSP
引擎繼續執行這個標記并輸出執行結果
l????????
SKIP_BODY
:
jsp
引擎將忽略這個
tag
后部分的執行。
2、??
InitBody()
初始化
Tag Body
,沒有任何返回值。
3、??
doAfterBody()
:
這個方法緊接著
doInitBody()
方法執行這是一個自調用式的方法。
l????????
SKIP_BODY
:
當它的返回值為
SKIP_BODY
時
JSP
引擎將跳出對這個
Tag
的執行執行
Tag
后面的內容
l????????
EVAL_BODY_TAG
:
如果
doAfterBody()
方法的返回值為
EVAL_BODY_TAG
那么
JSP
引擎會自動調用
doAfterBody()
方法直至返回值不是
EVAL_BODY_TAG
時
JSP
引擎才會跳出這個執行循環
4、??
doEndTag()
l????????
SKIP_PAGE
:
如果是這樣的話那么
Tag
后面的所有內容都將被
JSP
引擎自動跳過
l????????
EVAL_PAGE
:
doEndTag()
方法的返回值也有可能為
EVAL_PAGE
如果是這樣的話那么
JSP
引擎會繼續執行該
Tag
后面的值
5、??
release()
注解:
release()
方法
doEndTag()
方法無論在什么時候都將被執行
,哪怕d
oStartTag()
方法或者
doAfterBody()
方法的返回值為
SKIP_BODY
那么這兩個方法的后面各步都沒有機會被執行
JSP
引擎自動把它們跳過了例如當
doStartTag()
方法的返回值為
SKIP_BODY
時那么
doInitBody()
方法
doAfterBody()
方法方法都不會被執行。
Tag
常量:
Tag
接口中定義了四個:
EVAL_BODY_INCLUDE
把
Tag
的執行結果合并到某個輸出流中只有
doStartTag()
方法才有可能返回這個值如果
Tag Handler
擴展了
BodyTag
接口那
么
doStartTag ()
方法不能夠返回這個值。
類和接口:
開發接口:
Tag接口和TagSupport類:
BodyTag接口和BodyTagSupport類:
定義信息:
TagInfo和TagExtraInfo類:
TagLibaryInfo和TagAttributeInfo類:
其他來自網絡上的內容:
定義變量:
?
??
????id
????database.BookDetails
????true
????AT_BEGIN
??
定義
TEI
:
定義
TEI
和定義變量的作用其實是一樣的,提供一些可供
jsp script
使用的變量而已,只是這個可以更加的靈活方便一些而已。
GetVaraibleInfo
接口。