|
servlet 2.5
2005年9月26日,Sun公司和JSR154的專家組發(fā)布Servlet API的一個新的版本。在一般情況下,一個JSR的新版本僅僅包
括對以前少數(shù)有名無實的規(guī)范進行去除更新。但這次,新版本中增加新的特征和變化,他們對Servlets的產(chǎn)生重要影響,使得Servlet的版本升到了
2.5。
在這篇文章里,我主要談?wù)凷ervlet2.5版本中的新特征。描述每一個變化,闡述那些必要變化產(chǎn)生的背景,并展示如何在基于Servlet的項目中利用這些變化。 事實上,這是我為JavaWorld提供的第六篇關(guān)于Servlet API更新資料的文章。這篇文章意在兩個目的:從眼前來看,向你介紹 Servlet的新特征。從長遠來看,是展現(xiàn)Servlet變化的歷史概要,這樣當你基于老的Servlet API版本進行編碼的時候,你可以正確地決 定哪些特征和功能你可以使用,而哪些特征和功能你不應(yīng)該使用。你可以參考我先前寫的關(guān)于Servlet的文章。 注意:當你想實踐這些Servlet的新特征和功能時,你要知道的是:并不是所有的Servlet容器和Java企業(yè)級應(yīng)用服務(wù)器都能立即適用于最新 版的Servlet API,寫這篇文章時(2006年1月2日),Jetty 6 server和Sun公司的GlassFish server是公認 最好的支持Servlet2.5的容器,而Apache Tomcat5.5和Jboss 4.0目前只支持Servlet2.4。 Servlet2.5一些變化的介紹: 1) 基于最新的J2SE 5.0開發(fā)的。 2) 支持注釋。 3) web.xml中的幾處配置更加方便。 4) 去除了少數(shù)的限制。 5) 優(yōu)化了一些實例 J2SE 5.0的產(chǎn)物: 從一開始,Servlet 2.5 規(guī)范就列出J2SE 5.0 (JDK 1.5) 作為它最小的平臺要求。它使得Servlet2.5只能適用基于J2SE 5.0開發(fā)的平臺,這個變動意味著所有J2SE5.0的新特性可以保證對Servlet2.5程序員有用。 傳統(tǒng)意義上,Servlet和JEE版本一直與JDK的版本保持同步發(fā)展,但是這次,Servlet的版本跳過1.4版本。專家組認為版本的加速增長是正當?shù)?,因為J2SE5.0提出一個引人注目的,Servlet和JEE規(guī)范都要利用的特征??注釋。 注釋: 注釋是作為JSR175的一部分提出的(一種為Java語言設(shè)計提供便利的Metadata)一種新的語言特色。它是利用Metadata為Java 編碼結(jié)構(gòu)(類,方法,域等等)裝飾的一種機制。它不能像代碼那樣執(zhí)行,但是可以用于標記代碼,這個過程是基于Metadata信息的代碼處理機,通過更新 他們的事件行為來實現(xiàn)的。 我們可以憑借不同的技巧來注釋類和方法,例如連續(xù)地標記接口或者是@deprecated Javadoc評論。這種新式的Metadata可以便利地提供了一種標準的機制來實現(xiàn)注釋功能,以及通過庫來創(chuàng)建用戶自己的注釋類型的變量。 下面是一個簡單的Web service 注釋例子: import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class HelloWorldService { @WebMethod public String helloWorld() { return "Hello World!"; } } @WebService和@WebMethod這兩個注釋類型,在JSR181(為Java平臺提供的Web ServicesMetadata)有詳細 說明,可以像類一樣的引用,標記這個類作為一個Web service并且標記它的helloWorld()方法做為一個Web service方法。對 于他們本身來說,注釋只是寫在那里并沒有什么作用,好像在崗位上做記錄一樣,但是,一個容器一旦加載這個類并對那些注釋進行二進制編碼,就可以把這個類連 到Web service上。 注釋可以接受屬性/值這些參數(shù)。它保存著參數(shù)的信息并且可以利用這些參數(shù)來更改被請求的事件行為。例如下面更高級的注釋例子: @WebService( name = "PingService", targetNamespace=http:///ping ) @SOAPBinding( style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL ) public class Ping { @WebMethod(operationName = "Foo") public void foo() { } } 一旦加載了這個類,一個正確配置的容器就會識別出注釋及其參數(shù),并將這個做為一個PingService通過利用remote-procedure- call/literal的編碼方式與一個Foo operation相連。實際上,注釋便指明了類和類的容器之間的聯(lián)系。 Java本身的規(guī)范(JSR175)僅僅有少量的注釋類型變量。而這些有趣的注釋類型變量主要來自于其他的JSRs: "JSR 250: Java平臺的公共注釋 "JSR 220: 企業(yè)級JavaBeans 3.0 "JSR 224: 基于XML的Java API Web Services (JAX-WS) 2.0 "JSR 181: Java平臺的Web Services Metadata Servlet2.5中的注釋: 回到Servlet2.5上來,一種新的規(guī)范描述了幾種注釋在Servlet環(huán)境中是如何工作的。功能弱的Servlet容器忽略了這些規(guī)范,然而JEE容器中的Servlet卻嚴格遵守這些規(guī)范。 有的注釋提供了在XML注冊的可選擇性,否則就要注冊在配置文件web.xml中。有的作為容器的請求來執(zhí)行其任務(wù),否則就由Servlet親自來執(zhí)行。還有的注釋兩者都具備。 注釋準確的定義不是完全固定的,因為Servlet本身并沒有定義注釋。它僅僅解釋了它們?nèi)绾斡绊慡ervlet環(huán)境,下面是注釋的一個簡要的概述,你可以看到在JEE5中它們的用途: "@Resource and @Resources:@Resource位于類或變量中以對Servlet容器進行“資源注入”。當容器識別出這個注釋 時,它會在獲得服務(wù)地位之前,用適當?shù)闹祵崿F(xiàn)帶注釋的變量的重新注入。通過使用這種注釋,你不必利用JNDI來查找命令和在配置文件web.xml中手動 聲明資源。服務(wù)器通過Servlet的自我調(diào)整來執(zhí)行它的任務(wù)。變量的名稱和類型由映像機制自動確定,盡管你可以利用注釋的參數(shù)來超越這一限制。一個注入 的資源可以是數(shù)據(jù)源,Java信息服務(wù)目的文件或者是環(huán)境設(shè)置的標量。下面是一個例子: @Resource javax.sql.DataSource catalog; public getData() { Connection con = catalog.getConnection(); } 現(xiàn)在,在這段Servlet代碼變成服務(wù)之前,容器會定位JNDI變量,并對于目錄變量進行手動分配。 為了效率,僅僅某些類支持資源注入,這些類有:Servlets,Servlet過濾器,Servlet事件監(jiān)聽器,JSP標簽操作器,JSP庫事件監(jiān)聽器,用于處理beans的JSF,以及一些與Serlvets無關(guān)的類。 "@Resources注釋與@Resource相似,但是它用于一組@Resource注釋。它們都來自JSR250,是Java平臺的公共注釋。 "@PostConstruct and @PreDestroy:可以使方法成為帶有生命周期的方法。@PostConstruct方法用于資源注入初 始化之后。@PreDestroy方法用于Servlet脫離服務(wù)并釋放注入的資源的時候?;厥盏姆椒ū仨毷鞘聦嵉姆椒ǎ祷豽oid并且不可以拋出任何 異常。這些注釋本質(zhì)上使得任何方法都成為init()和destroy()的子方法,這些特征也來自與JSR250。 "@EJB:類似于@Resource,設(shè)計用于注入企業(yè)級的JavaBeans。比起@Resource,它略有不同,在于@EJB的參數(shù)特定設(shè)計用來定位EJB的參數(shù)。這個注釋來自EJB3.0的規(guī)范。 "@WebServiceRef:與@Resource 和 @EJB相似,設(shè)計用于注入Web service參數(shù)。來自于JAX-WS2.0規(guī)范。 "@PersistenceContext, @PersistenceContexts, @PersistenceUnit, and @PersistenceUnits:這些注釋來自EJB3.0規(guī)范來支持Java對象的持久化。 "@DeclareRoles: 定義應(yīng)用程序中安全角色的使用。當定義一個Servlet類時,在配置文件web.xml中<security-role>標簽中對它進行設(shè)置,來自JSR250。 " @RunAs:用于聲明哪個類應(yīng)該執(zhí)行。當定義一個Servlet類時,在配置文件web.xml中<run-as>標簽中對它進行設(shè)置。來自于JSR250。 注釋的執(zhí)行: J2EE的兩種重要的表現(xiàn)層技術(shù)JSP和JSF發(fā)布了新技術(shù)規(guī)范的預(yù)覽版本,其中最重要的一點是兩者將表達式語言(Expression Language,EL)部分合二為一。在不久的將來,這兩種技術(shù)有可能更進一步地彼此融合,成為一種統(tǒng)一的表現(xiàn)層技術(shù)。然而在J2EE社群的普遍觀點 中,如果單單作為一種視圖技術(shù),JSP并不是最佳的選擇,Velocity和XSLT等基于模板的視圖技術(shù)通常比JSP更方便;而基于組件的JSF也面臨 廣泛的信任危機。兩者的組合是否能得到業(yè)界的認可,還需要時間的檢驗。 jsp 2.1
JSP 2.1把Expression Language(EL)輸出到它自己各自分離的文檔中,在技術(shù)上,這些文檔是JSP規(guī)范的子文檔。這些統(tǒng)一的EL規(guī)范定義了一個更高層的java 包,javax.el。這個包與使用它的技術(shù)之間完全獨立,并且允許此技術(shù)將自身插入EL處理過程。更改的JSP規(guī)范遵從使用標準化EL的規(guī)范。 對于前面提到的JSR-252,這個規(guī)范并沒什么新特性。Faces 1.2支持新的標準化EL,還包含一些bug修復(fù)的相關(guān)規(guī)范。 Faces和JSP在JSRs下的結(jié)盟帶來了一些新功能,也為將來的發(fā)展打下了堅實的基礎(chǔ)。例如,在同時使用Faces和JSP的web應(yīng)用中,網(wǎng)頁僅使 用JSP(不包含任何faces內(nèi)容)來訪問Managed Beans成為可能。在JSP規(guī)范的附錄E中和Faces規(guī)范的前言中都可以看到更改內(nèi)容的細節(jié)。 |
|
|
來自: 漂在北方的狼 > 《JSP規(guī)范》