熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Servlet 3.0公開預覽版引發爭論

2013-11-23 19:39:13  來源: Java核心技術 

  JSR發布了Servlet規范的公開預覽版同時在GlassFish代碼分支上提供了參考實現這次發布引發了人們對於專家組(Expert Group)為下一代Servlet API和整個Java EE 平台做出的各種選擇的爭論

  Servlet API一直處於風口浪尖從初期草稿開始JSR 專家組致力於在類似便捷開發插件性等領域完善和提高該規范其領袖之一Rajiv Mordani這樣說道

  便捷開發(Ease of Development):在早期草案中我們添加了一些注解允許你像POJO一樣寫Servlet但是在專家組的若干次討論和社區反饋之後我們決定刪除像@GET @POST這樣的方法層注解保留doGetdoPos方法和擴展HttpServlet類但是那些重命名以更有效使用的最頂層注解仍然存在 @WebServlet用於聲明一個servlet@ServletFilter聲明過濾器@WebServletContextListener定 義ServletContextListener除了這些注解像@Resource這種自Servlet就一直支持的注解則保持不變

  可插入性構建於servlet之上的Web框架在開發人員中很受歡迎其中很多人提出了各種各樣的問題為了更好地支持框架便於開發人員編寫web應用我們在servlet規范中添加一些方式以幫助開發人員根據自身情況使用和管理框架

  異步處理這是我們在servlet規范中變化最大的部分在早期草案中我們暫停重新開始確定了我們定義的語義但是在這之後專家組對於如何解決異步處理的各種用例進行了大量的討論規范中做出的修改現在也可以解決各種問題

  Roy Van Rijn表達了他對於早期草案中出現的一些特性的擔憂

  我更傾向於完全不使用針對GET/POST方法的注解但是我發現Java EE 規范提倡使用類似的注解JSR的編寫者別無選擇(糟糕的借口)我在本文中表達的觀點已經發給了JSR組織但至今沒有回應

  我也找不到一名成員給出原因解釋澄清等等最近Java EE 規范發布公開預覽版其中包含了對Servlet 規范的引用所以這會成為Java EE 的一部分但是我懇請他們花時間重新考慮關於注解的決定

  隨著規范公開預覽版的發布來自Webtide的Greg Wilkins認為該規范非常糟糕是不和諧的專家組和有缺陷的流程的產物他的主要觀點包括

  它代表了API設計上的一次思想實驗不關注實現的復雜性試用可行性和社區反饋
  要求測試實現的請求被拒絕了
  沒有公開的或者合理的機制來收集來自社區的需求和寶貴的社區咨詢
  一些模糊的需求(比如包裝的異步請求)在較晚時候包含進來沒有用例和用戶需求
  寫的非常糟糕就像大多數JCP文檔一樣
  一些新的特性引起了安全隱患並可能導致部署緩慢

  異步servlet的建議被改變了與早期草案不同最初的方法是Jetty Continuations的結果月即可在Jetty prerelease中試用已經在很多框架和應用中測試過包括ometdDWRJSF和BlazeDS

  Greg總結說

  我相信在現在的預覽版中有明顯的錯誤這些缺陷已經多的讓人很容易就可以發現當我從專家組收到關於這些問題的支持信息時我無法確信規范領袖的合法身份我可能因為過於嚴厲而無法得到幫助了

  Rajiv對Greg的答復中指出

  在GlassFish中有相關實現
  他從沒看到過Greg的請求
  如果不喜歡新功能可以禁止使用
  沒有明顯的證據表明部署會變慢
  異步servlet增加的方式更被社區所喜歡他引用了專家組的郵件

  Rajiv也提到了來自RedHat的Bill Burke寫的一篇博文其中他批評了Jetty 中的異步servlet實現

  隨後Greg Wilkins宣布他致力於Servlet 異步servlet的一個實現他在博客上列舉了一些修正/擴展和與專家組的持續討論其中包括

  新的異步分發器類型(ASYNC DispatcherType )用於分發異步請求 
  當請求分發時isAsyncStarted()方法為false 

  如果getReader()或者getOutputStream()已經被調用則調用startAsync()或者 startAsync(requestresponse)時會拋出IllegalStateException異常這可以把異步處理器限制到簡單的情 況下 

  如果通過startAsync(requestresponse)啟動異步模式在AsyncContext上使用任何forward()方法都會有IllegalStateException異常這避免了分發包裝器的復雜但允許異步處理器使用包裝器 

  forward(path)和forward(contextpath)方法還沒有實現

  代碼可以從Jetty分支和servletapi分支中得到

  Grep談到了異步servlet的事情

  雖然還需要更多測試但是這個代碼已經實現了基本的異步行為不需要很復雜的重新分發請求或者前遞方法我相信這代表了的合理折中方案在我們從的簡單子集裡獲得經驗之後如果需要更多的特性可以添加到


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27249.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.