自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Servlet2.5版本的特征淺析

開(kāi)發(fā) 后端
Servlet2.5版本的特點(diǎn)是什么呢?在這篇文章里,我主要談?wù)凷ervlet2.5版本中的特征,是那些特性對(duì)Servlets的產(chǎn)生重要影響。

在這篇文章里,我主要談?wù)凷ervlet2.5版本中的特征。描述每一個(gè)變化,闡述那些必要變化產(chǎn)生的背景,并展示如何在基于Servlet的項(xiàng)目中利用這些變化。向你介紹Servlet的新特征。你可以正確地決定哪些特征和功能你可以使用,而哪些特征和功能你不應(yīng)該使用。

注意:當(dāng)你想實(shí)踐這些Servlet的特征和功能時(shí),你要知道的是:并不是所有的Servlet容器和Java企業(yè)級(jí)應(yīng)用服務(wù)器都能立即適用于新版的Servlet API,Apache Tomcat5.5和Jboss 4.0目前只支持Servlet2.4。

版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保留以下作者信息和鏈接
作者:evenbetter
原文:http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html
譯文:http://www.matrix.org.cn/resource/article/44/44208_Servlet+2.5.html
關(guān)鍵字:Servlet;2.5

Servlet2.5一些變化的介紹:

◆基于最新的J2SE 5.0開(kāi)發(fā)的。

◆支持annotations 。

◆web.xml中的幾處配置更加方便。

◆去除了少數(shù)的限制。

◆優(yōu)化了一些實(shí)例

J2SE 5.0的產(chǎn)物

從一開(kāi)始,Servlet 2.5 規(guī)范就列出J2SE 5.0 (JDK 1.5) 作為它最小的平臺(tái)要求。它使得Servlet2.5只能適用基于J2SE 5.0開(kāi)發(fā)的平臺(tái),這個(gè)變動(dòng)意味著所有J2SE5.0的特性可以保證對(duì)Servlet2.5程序員有用。

傳統(tǒng)意義上,Servlet和JEE版本一直與JDK的版本保持同步發(fā)展,但是這次,Servlet的版本跳過(guò)1.4版本。專家組認(rèn)為版本的加速增長(zhǎng)是正當(dāng)?shù)?,因?yàn)镴2SE5.0提出一個(gè)引人注目的,Servlet和JEE規(guī)范都要利用的特征—Annotations。

Annotations

Annotations是作為JSR175的一部分提出的(一種為Java語(yǔ)言設(shè)計(jì)提供便利的Metadata)一種新的語(yǔ)言特色。它是利用Metadata為Java編碼結(jié)構(gòu)(類,方法,域等等)裝飾的一種機(jī)制。它不能像代碼那樣執(zhí)行,但是可以用于標(biāo)記代碼,這個(gè)過(guò)程是基于Metadata信息的代碼處理機(jī),通過(guò)更新他們的事件行為來(lái)實(shí)現(xiàn)的。

我們可以憑借不同的技巧來(lái)注釋類和方法,例如連續(xù)地標(biāo)記接口或者是@deprecated Javadoc評(píng)論。這種新式的Metadata可以便利地提供了一種標(biāo)準(zhǔn)的機(jī)制來(lái)實(shí)現(xiàn)注釋功能,以及通過(guò)庫(kù)來(lái)創(chuàng)建用戶自己的注釋類型的變量。

下面是一個(gè)簡(jiǎn)單的Web service 注釋例子:

  1. import javax.jws.WebService;  
  2.  
  3. import javax.jws.WebMethod;  
  4.  
  5. @WebServicepublic class HelloWorldService {   
  6.  
  7.  @WebMethod  public String helloWorld() {    
  8.  
  9.   return "Hello World!";  }} 

@WebService和@WebMethod這兩個(gè)注釋類型,在JSR181(為Java平臺(tái)提供的Web ServicesMetadata)有詳細(xì)說(shuō)明,可以像類一樣的引用,標(biāo)記這個(gè)類作為一個(gè)Web service并且標(biāo)記它的helloWorld()方法做為一個(gè)Web service方法。對(duì)于他們本身來(lái)說(shuō),注釋只是寫在那里并沒(méi)有什么作用,好像在崗位上做記錄一樣,但是,一個(gè)容器一旦加載這個(gè)類并對(duì)那些注釋進(jìn)行二進(jìn)制編碼,就可以把這個(gè)類連到Web service上。

注釋可以接受屬性/值這些參數(shù)。它保存著參數(shù)的信息并且可以利用這些參數(shù)來(lái)更改被請(qǐng)求的事件行為。例如下面更高級(jí)的注釋例子:

  1. @WebService( name = "PingService",  targetNamespace=http://acme.com/ping)  
  2.  
  3. @SOAPBinding(  style=SOAPBinding.Style.RPC,  use=SOAPBinding.Use.LITERAL)  
  4.  
  5. public class Ping {  @WebMethod(operationName = "Foo")   
  6.  
  7.  public void foo() { }} 

一旦加載了這個(gè)類,一個(gè)正確配置的容器就會(huì)識(shí)別出注釋及其參數(shù),并將這個(gè)做為一個(gè)PingService通過(guò)利用remote-procedure-call/literal的編碼方式與一個(gè)Foo operation相連。實(shí)際上,注釋便指明了類和類的容器之間的聯(lián)系。

Java本身的規(guī)范(JSR175)僅僅有少量的注釋類型變量。而這些有趣的注釋類型變量主要來(lái)自于其他的JSRs:

◆JSR 250: Java平臺(tái)的公共注釋

◆JSR 220: 企業(yè)級(jí)JavaBeans 3.0

◆JSR 224: 基于XML的Java API Web Services (JAX-WS) 2.0

◆JSR 181: Java平臺(tái)的Web Services Metadata

Servlet2.5中的注釋:

回到Servlet2.5上來(lái),一種新的規(guī)范描述了幾種注釋在Servlet環(huán)境中是如何工作的。功能弱的Servlet容器忽略了這些規(guī)范,然而JEE容器中的Servlet卻嚴(yán)格遵守這些規(guī)范。

有的注釋提供了在XML注冊(cè)的可選擇性,否則就要注冊(cè)在配置文件web.xml中。有的作為容器的請(qǐng)求來(lái)執(zhí)行其任務(wù),否則就由Servlet親自來(lái)執(zhí)行。還有的注釋兩者都具備。

注釋準(zhǔn)確的定義不是完全固定的,因?yàn)镾ervlet本身并沒(méi)有定義注釋。它僅僅解釋了它們?nèi)绾斡绊慡ervlet環(huán)境,下面是注釋的一個(gè)簡(jiǎn)要的概述,你可以看到在JEE5中它們的用途:

◆@Resource and @Resources:@Resource位于類或變量中以對(duì)Servlet容器進(jìn)行“資源注入”。當(dāng)容器識(shí)別出這個(gè)注釋時(shí),它會(huì)在獲得服務(wù)地位之前,用適當(dāng)?shù)闹祵?shí)現(xiàn)帶注釋的變量的重新注入。通過(guò)使用這種注釋,你不必利用JNDI來(lái)查找命令和在配置文件web.xml中手動(dòng)聲明資源。服務(wù)器通過(guò)Servlet的自我調(diào)整來(lái)執(zhí)行它的任務(wù)。變量的名稱和類型由映像機(jī)制自動(dòng)確定,盡管你可以利用注釋的參數(shù)來(lái)超越這一限制。一個(gè)注入的資源可以是數(shù)據(jù)源,Java信息服務(wù)目的文件或者是環(huán)境設(shè)置的標(biāo)量。下面是一個(gè)例子:

  1. @Resource javax.sql.DataSource catalog;  
  2.  
  3. public getData() {  Connection con = catalog.getConnection();} 

現(xiàn)在,在這段Servlet代碼變成服務(wù)之前,容器會(huì)定位JNDI變量,并對(duì)于目錄變量進(jìn)行手動(dòng)分配。

為了效率,僅僅某些類支持資源注入,這些類有:Servlets,Servlet過(guò)濾器,Servlet事件監(jiān)聽(tīng)器,JSP標(biāo)簽操作器,JSP庫(kù)事件監(jiān)聽(tīng)器,用于處理beans的JSF,以及一些與Serlvets無(wú)關(guān)的類。

◆@Resources注釋與@Resource相似,但是它用于一組@Resource注釋。它們都來(lái)自JSR250,是Java平臺(tái)的公共注釋。

◆@PostConstruct and @PreDestroy:可以使方法成為帶有生命周期的方法。@PostConstruct方法用于資源注入初始化之后。@PreDestroy方法用于Servlet脫離服務(wù)并釋放注入的資源的時(shí)候?;厥盏姆椒ū仨毷鞘聦?shí)的方法,返回void并且不可以拋出任何異常。這些注釋本質(zhì)上使得任何方法都成為init()和destroy()的子方法,這些特征也來(lái)自與JSR250。

◆@EJB:類似于@Resource,設(shè)計(jì)用于注入企業(yè)級(jí)的JavaBeans。比起@Resource,它略有不同,在于@EJB的參數(shù)特定設(shè)計(jì)用來(lái)定位EJB的參數(shù)。這個(gè)注釋來(lái)自EJB3.0的規(guī)范。

◆@WebServiceRef:與@Resource 和 @EJB相似,設(shè)計(jì)用于注入Web service參數(shù)。來(lái)自于JAX-WS2.0規(guī)范。

◆@PersistenceContext, @PersistenceContexts, @PersistenceUnit, and @PersistenceUnits:這些注釋來(lái)自EJB3.0規(guī)范來(lái)支持Java對(duì)象的持久化。

◆@DeclareRoles: 定義應(yīng)用程序中安全角色的使用。當(dāng)定義一個(gè)Servlet類時(shí),在配置文件web.xml中﹤security-role﹥標(biāo)簽中對(duì)它進(jìn)行設(shè)置,來(lái)自JSR250。

◆ @RunAs:用于聲明哪個(gè)類應(yīng)該執(zhí)行。當(dāng)定義一個(gè)Servlet類時(shí),在配置文件web.xml中﹤run-as﹥標(biāo)簽中對(duì)它進(jìn)行設(shè)置。來(lái)自于JSR250。

Annotation的效率

不論你使用注釋與否——尤其在你不使用時(shí)——它對(duì)于理解服務(wù)器上程序的執(zhí)行有著重要意義。為了讓服務(wù)器識(shí)別類中的注釋,它必須加載這些類,這就意味著服務(wù)器必須是啟動(dòng)著的,服務(wù)器通過(guò)WEB-INF/classes目錄下和WEB-INF/lib目錄下的所有類文件來(lái)查找注釋。(每個(gè)規(guī)范下,服務(wù)器不必查找這兩個(gè)目錄以外的目錄。)你可以通過(guò)下面的方法指明﹤web-app﹥根的屬性而不必使用如何進(jìn)行注釋:

  1. ﹤web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5" full="true"﹥  
  2.  
  3. ﹤/web-app﹥ 

web.xml的便利

Servlet2.5對(duì)于web.xml引入幾個(gè)小的變動(dòng),使得它更加方便。

Servlet名稱的通配符化
首先,當(dāng)你寫﹤filter-mapping﹥,你現(xiàn)在可以在﹤Servlet-name﹥標(biāo)簽中使用*號(hào)來(lái)代表所有的Servlets。而以前,你必須一次把一個(gè)Servlet綁定到過(guò)濾器上,像這樣:

  1. ﹤filter-mapping﹥    
  2. ﹤filter-name﹥Image Filter﹤/filter-name﹥    
  3. ﹤Servlet-name﹥ImageServlet﹤/Servlet-name﹥  
  4. ﹤/filter-mapping﹥  

現(xiàn)在,你可以一次綁定所有的Servlets:

  1. ﹤filter-mapping﹥    
  2. ﹤filter-name﹥Image Filter﹤/filter-name﹥   
  3.  ﹤Servlet-name﹥*﹤/Servlet-name﹥   
  4.  ﹤!—新特征 --﹥  
  5. ﹤/filter-mapping﹥ 

這有著很大用途,例如:

  1. ﹤filter-mapping﹥    
  2. ﹤filter-name﹥Dispatch Filter﹤/filter-name﹥   
  3.  ﹤Servlet-name﹥*﹤/Servlet-name﹥    
  4. ﹤dispatcher﹥FORWARD﹤/dispatcher﹥  
  5. ﹤/filter-mapping﹥ 

映射的復(fù)合模式

其次,當(dāng)我們寫﹤Servlet-mapping﹥ 或者 ﹤filter-mapping﹥時(shí),你現(xiàn)在可以在同一的標(biāo)簽中采用復(fù)合匹配的標(biāo)準(zhǔn)。以前一個(gè)﹤Servlet-mapping﹥只支持一個(gè)﹤url-pattern﹥?cè)?,現(xiàn)在它不只支持一個(gè),例如:

  1. ﹤Servlet-mapping﹥   
  2.  ﹤Servlet-name﹥color﹤/Servlet-name﹥    
  3. ﹤url-pattern﹥/color/*﹤/url-pattern﹥    
  4. ﹤url-pattern﹥/colour/*﹤/url-pattern﹥  
  5. ﹤/Servlet-mapping﹥ 

同樣地,以前﹤filter-mapping﹥也是只支持一個(gè)﹤url-pattern﹥ 或者一個(gè) ﹤Servlet-name﹥。現(xiàn)在它對(duì)于每個(gè)元素都可以支持任意多個(gè):

  1. ﹤filter-mapping﹥   
  2.  ﹤filter-name﹥Multipe Mappings Filter﹤/filter-name﹥    
  3. ﹤url-pattern﹥/foo/*﹤/url-pattern﹥   
  4.  ﹤Servlet-name﹥Servlet1﹤/Servlet-name﹥   
  5.  ﹤Servlet-name﹥Servlet2﹤/Servlet-name﹥    
  6. ﹤url-pattern﹥/bar/*﹤/url-pattern﹥  
  7. ﹤/filter-mapping﹥ 

HTTP方法名

最近,你可以將合法的HTTP/1.1方法名放進(jìn)﹤http-method﹥?cè)刂小.?dāng)你使用這些方法時(shí),﹤http-method﹥將指明﹤security-constraint﹥標(biāo)記里的方法應(yīng)該被應(yīng)用。從以前來(lái)看,它僅限于HTTP/1.1的7個(gè)標(biāo)準(zhǔn)方法:GET,POST,PUT,DELETE,HEAD,OPTIONS和TRACE。但是,HTTP/1.1允許對(duì)方法進(jìn)行擴(kuò)展,WebDAV是用于這種擴(kuò)展的普遍技術(shù)。在Servlet2.5中,你可以安全地約束任何可能的HTTP方法名,標(biāo)準(zhǔn)及擴(kuò)展,包括WebDAV方法,例如:LOCK,UNLOCK,COPY及MOVE。

如果你寫一個(gè)WebDAV的Servlet,你不必使用doLock()和doCopy()方法。你必須寫自己的service()方法及分派request.getMethod()方法。正由于這種變化,你不必管理系統(tǒng)的安全性。

去除限制

Servlet2.5去除了關(guān)于錯(cuò)誤處理和回話跟蹤的一些限制。對(duì)于錯(cuò)誤處理,Servlet2.5之前,配置在﹤error-page﹥中的錯(cuò)誤處理頁(yè)面不能通過(guò)調(diào)用setStatus()方法來(lái)修改觸發(fā)他們的錯(cuò)誤代碼,而Servlet2.5減弱了這一規(guī)范。這樣的規(guī)范的產(chǎn)生于這樣的觀點(diǎn),就是錯(cuò)誤頁(yè)面的工作是指出每個(gè)錯(cuò)誤而不是修改錯(cuò)誤。但是,實(shí)際使用中,錯(cuò)誤頁(yè)面不只是用于指出錯(cuò)誤,而是還能做更多的事情,或許可以代替在線幫助來(lái)幫助用戶解決問(wèn)題。這個(gè)規(guī)范將不再限制錯(cuò)誤頁(yè)面所產(chǎn)生的反饋信息。

對(duì)于會(huì)話跟蹤,Servlet2.5之前,調(diào)用RequestDispatcher.include()的Servlet不能設(shè)置響應(yīng)的標(biāo)題頭,而Servlet2.5減弱了這一規(guī)范。原規(guī)范的目的是使內(nèi)部的Servlets限制在自己的頁(yè)面空間中,不可以影響外部的頁(yè)面。現(xiàn)在這個(gè)規(guī)范已經(jīng)減弱,允許在內(nèi)部的Servlet中使用request.getSession()命令,這個(gè)命令可以悄悄地創(chuàng)建一個(gè)會(huì)話跟蹤cookie的標(biāo)題頭。邏輯上要求限制內(nèi)部的資源,但邏輯上也要求這些限制不應(yīng)該取消其啟動(dòng)session的這一功能。這個(gè)變動(dòng)對(duì)于Portlet規(guī)范來(lái)說(shuō)顯得尤其重要。作用是:如果響應(yīng)已經(jīng)有效,則getSession()命令就會(huì)拋出一個(gè)IllegalStateException(異常),而在此之前,就沒(méi)有這個(gè)功能。

Clarifications

最近,新的規(guī)范對(duì)一些邊緣方法進(jìn)行了說(shuō)明,使得Servlets更加方便而且保證了更好地按要求工作。

終止響應(yīng)

第一處說(shuō)明細(xì)小又深?yuàn)W,但做為規(guī)范中的一個(gè)例子還有蠻有趣的。Servlet2.4規(guī)范規(guī)定響應(yīng)在這幾種情況下應(yīng)該是有效的,包括:在響應(yīng)的setContentLength方法中內(nèi)容已經(jīng)明確說(shuō)明,以及內(nèi)容已經(jīng)寫進(jìn)了響應(yīng)中。這種情況只有你的代碼像下面這樣才可以使響應(yīng)重新定向:

  1. response.setHeader("Host", "localhost");  
  2.  
  3. response.setHeader("Pragma", "no-cache");  
  4.  
  5. response.setHeader("Content-Length", "0");  
  6.  
  7. response.setHeader("Location", "http://www.apache.org"); 


Servlet技術(shù)忽略特定區(qū)域的標(biāo)題頭,因?yàn)閮?nèi)容滿足0字節(jié)長(zhǎng)度,響應(yīng)就會(huì)立即生效。而在它開(kāi)始之前,響應(yīng)就已失效了!

Servlet容器通常拒絕執(zhí)行這種行為,而Servlet2.5版本增加了“長(zhǎng)度必須大于0”這個(gè)原則。

實(shí)例編碼

Servlet2.4規(guī)范規(guī)定必須在調(diào)用request.getReader()方法之前調(diào)用request.setCharacterEncoding()方法。但是,如果你忽略這個(gè)原則而在其之后去調(diào)用request.setCharacterEncoding()方法,那么會(huì)產(chǎn)生什么后果,這個(gè)問(wèn)題規(guī)范里并沒(méi)有說(shuō)。為了簡(jiǎn)便,現(xiàn)在消除這種情況!

Cross-context sessions(不同上下文目錄間的會(huì)話)

最近,關(guān)于Cross-context會(huì)話處理的規(guī)則已經(jīng)明確說(shuō)明。當(dāng)Servlets指派從一個(gè)上下文到其他上下文的請(qǐng)求時(shí),這個(gè)規(guī)則就發(fā)揮了作用——在目標(biāo)調(diào)用過(guò)程中,包括哪些會(huì)話。這個(gè)版本的出現(xiàn)使得一個(gè)上下文目錄的主頁(yè)里的portlets可以通過(guò)幾種內(nèi)部的命令來(lái)對(duì)別的上下文目錄里的portlets起作用。Servlet2.5明確指出一個(gè)上下文目錄里的資源可以訪問(wèn)其他上下文目錄的session(會(huì)話),而不用考慮這個(gè)請(qǐng)求從哪里開(kāi)始的。這意味著portlets可以脫離主頁(yè)的范圍而在自己的范圍里運(yùn)行,而且這個(gè)規(guī)范還會(huì)應(yīng)用在不兼容的Serlvet容器中。

期待

由于Servlet2.5版本要保持一些舊的性質(zhì),幾個(gè)大的概念不得不延后到下一個(gè)階段。它們包括:

◆新的輸入/輸出(NIO)支持:使NIO通道更有利于Servlets進(jìn)行客戶端通信成為可能。

◆過(guò)濾器wrap-under或wrap-over語(yǔ)義:有時(shí)用過(guò)濾器包裝請(qǐng)求,和/或者響應(yīng)對(duì)象去修改方法行為或者啟用新的方法。當(dāng)把這種包裝和服務(wù)器對(duì)請(qǐng)求和響應(yīng)的包裝結(jié)合起來(lái)時(shí),又應(yīng)該怎么包裝在一起?

◆用于歡迎的Servlets文件:做為索引應(yīng)該充當(dāng)歡迎作用的文件嗎?在此之前,這個(gè)回答是肯定的。但是規(guī)范沒(méi)有明確說(shuō)明如何使用這個(gè)功能,尤其在沒(méi)有索引的情況下。

◆用于歡迎的文件的分派規(guī)則:如何分派歡迎文件,這個(gè)細(xì)節(jié)并沒(méi)有完全說(shuō)明,而是遺留了一些開(kāi)放的缺口來(lái)應(yīng)對(duì)不兼容問(wèn)題。

◆登陸后選擇默認(rèn)頁(yè)面:如果用戶通過(guò)他們的書簽訪問(wèn)Servlet的登陸頁(yè)面,那么在成功登陸后頁(yè)面應(yīng)該轉(zhuǎn)向哪里呢?這個(gè)問(wèn)題至今尚未明確說(shuō)明。

◆用戶的主題日志:在通過(guò)網(wǎng)站正確地注冊(cè)之后,不通過(guò)傳統(tǒng)地登陸方式?jīng)]有辦法使Servlet信任用戶。

結(jié)束語(yǔ)

如果拋開(kāi)注釋來(lái)看Servlet2.5的變化,可見(jiàn)在配置文件web.xml中去除了一些限制,是有利的,同時(shí)又優(yōu)化了實(shí)例行為使其更適合更便于開(kāi)發(fā)Web系統(tǒng)(網(wǎng)頁(yè))。

Servlet2.5中注釋的作用更加戲劇化。Servlets本身不能聲明注釋類型的變量,甚至性能弱的Servlet容器都不支持注釋。然而在JEE5環(huán)境下的Servlets編寫者可以看到,通過(guò)公共的注釋及EJB3.0和JAX-WS2.0規(guī)范而引入的注釋類型會(huì)對(duì)代碼產(chǎn)生很大變化,并且這也將對(duì)Servlet如何管理外部資源,對(duì)象的持久化及EJB的構(gòu)成產(chǎn)生重大影響。

【編輯推薦】

  1. 在JSP中獲取數(shù)據(jù)庫(kù)連接
  2. 介紹JSP Action的使用
  3. 在JSP轉(zhuǎn)換為Servlet時(shí)
  4. Servlet方法中的常用五大方法淺析
  5. Servlet/JSP配置問(wèn)題的詳解
責(zé)任編輯:仲衡 來(lái)源: JSP中文網(wǎng)
相關(guān)推薦

2009-07-08 16:45:07

Servlet 2.5

2009-07-16 16:53:29

Jython 2.5

2015-07-20 16:48:53

MongoDB 2.5查詢引擎

2010-04-30 09:19:05

Servlet 3.0

2012-11-16 09:50:32

Windbg

2012-10-31 09:31:10

Android 4.2

2010-06-08 09:45:27

openSUSE 11

2012-05-07 23:45:54

FantomJavaJVM

2012-03-06 13:45:43

JavaJActor

2009-07-09 13:45:06

Servlet基本結(jié)構(gòu)

2009-07-06 09:23:51

Servlet定義

2009-07-08 10:02:41

Servlet 3.0

2010-08-26 17:08:20

vsftpd faq

2009-06-18 09:14:47

Spring modu

2014-07-04 13:33:03

jQueryjQuery Mobi

2010-06-08 10:34:23

opensuse 10

2012-05-09 09:11:52

Silverlight

2021-03-11 14:16:47

Spring Boo開(kāi)發(fā)腳手架

2010-02-24 17:38:45

Python 3.1版

2025-02-20 09:52:45

C# 6開(kāi)發(fā)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)