編譯時間標籤(對JSP進行的XSLT預先處理)
來源:互聯網
上載者:User
js|編譯 一篇舊文,翻出來回顧一下。BTW,抗議csdn的分類,XML怎能歸於.NET之下!!
發信人: HAX(海曦), 信區: WebDevelop
標 題:
發信站: 飲水思源 (2002年02月12日00:10:32 星期二), 站內信件
編譯時間標籤(對JSP進行的XSLT預先處理)
原文:http://www.mail-archive.com/taglibs-dev@jakarta.apache.org/msg00390.html
From: James Strachan
Subject: [OT]: Compile time tags. (XSLT preprocessing of JSP)
Date: Wed, 21 Mar 2001 12:20:45 -0800
翻譯:hax at sjtu dot edu dot cn
這裡是近來令我陷入沉思的關於分離的想法……
我喜歡JSP和自訂標籤,那讓我們把複雜的表現(presentation)和
商務邏輯抽象出來,隱藏到XML標籤之後。我也喜歡快速的JSP開發循
環??編輯一個JSP,在瀏覽器裡按下reload,烏拉!
我注意到有一些使用XSLT來實現JSP標籤的替代方案。例如Cocoon的
XSP和Resin的XTP。
http://xml.apache.org/cocoon/xsp.html
http://www.caucho.com/articles/xtp_templates.xtp
它讓我驚奇,在使用標準的JSP的同時,給我們的工具集裡加入基於X
SLT的“編譯時間”的標籤將會如何?
什麼是必需的?答案是:我們只要使用XML格式的JSP,並且在我們的
servlet引擎嘗試運行它們之前,將我們的XSLT文檔應用於這些JSP。
XSLT可以預先處理特定的XML標籤來完成簡單的格式轉換或加入動態代碼
。這些標籤可以像一般的JSP自訂標籤一樣,賦予命名空間。有了編
譯時標籤,以後我們可以做得更多……
----
實現:
如果servlet引擎不完全支援(JSP的)XML格式(我試過的許多引擎都
是如此),那麼我們可以總是使用XSLT預先處理進程來把JSP的XML格式
轉換成標準的<%= %>格式。
今天我們可以立即實現XSLT預先處理,就是在使用我們的web應用程式之
前,用Ant build system 構建(bulid)所有的JSP檔案。
然而這打斷了我們美妙的快速“編輯JSP然後reload”的開發環境。所
以如果我們能把XSLT‘預先處理’階段整合到我們的JSP編譯器裡,那將
是很cool的。
(這一段是以Tomcat/Jasper舉了個例子,譯略)
……我已經粗略的看過Jasper的原始碼,看上去給它加入某種預先處理
器的配置並不會太難。(當然如果JSP標準裡有使用web deployment
descriptor對JSP進行XSLT預先處理的入口(entry),那將更好 ;-) )
----
例子:
編譯時間標籤僅可以使用編譯時間變數,儘管它可以輸出JSP小指令碼
(scriptlet)運算式。例如,這裡是一個在JSP片斷中的普通的HTML
表單的例子。
<FORM action="something.jsp" method="get">
<P>
First name:
<INPUT type="text" name="firstname" />
<BR />
Last name:
<INPUT type="text" name="lastname" />
<BR />
email:
<INPUT type="text" name="email" />
</P>
<BR />
<INPUT type="submit" value="Send">
<INPUT type="reset">
</FORM>
使用XSLT預先處理,我們可以加入小指令碼運算式,以根據當前表單的狀
態在表單域中填入對應值,(於是變成):
<FORM action="something.jsp" method="get">
<P>
First name:
<INPUT
type="text" name="firstname"
value=´<%= getFormValue( pageContext, "firstname") %>´/>
<BR />
Last name:
<INPUT
type="text" name="lastname"
value=´<%= getFormValue( pageContext, "lastname") %>´/>
<BR />
email:
<INPUT
type="text" name="email"
value=´<%= getFormValue( pageContext, "email") %>´/>
</P>
<BR />
<INPUT type="submit" value="Send">
<INPUT type="reset">
</FORM>
函數getFormValue()可以用任何真實的Java代碼來擷取表單域值,可
以是自訂的表單包或者僅僅把servlet請求的參量拉出來。
這意味著從開發人員(developer)/設計者(designer)的視點來看,
JSP保持了‘clear’和類HTML的形式而沒有小指令碼??所有聰明的填
充發生在我們編譯JSP到Java代碼的時候。
請注意這也意味著我們不需要為每個類型(type)的Input標籤寫JSP
自訂標籤,不需要讓每個我們希望使用的可能屬性值有對應的Java
Bean屬性。在運行時,並沒有標籤被建立,頁面上僅僅有一點動態ja
va代碼將調用getFormValue()。所以,頁面將真的高效。
注意我不是在此鼓吹替代JSP自訂標籤,僅僅是鼓吹結合使用XSLT預
處理和JSP自訂標籤,這種構建web應用的真正優雅的方式……
Comments?
<James/>
James Strachan