Spring 框架 優勢 1.提供了一種管理對象的方法,能夠把中間層的對象有效地組織起來 2.採用了分層結構,能夠增量引入到項目中。 3.代碼測試較容易 4.非侵入性,應用程序對Spring API的依賴能夠減至最小 5.輕量級的架構解決方案 6.一致的數據訪問界面 缺點 1.由於spring使用了控制反轉技術,因此應用程序的邏輯被中斷,代碼變得不完整,但看代碼沒法把握全部行爲,不能瞭解整個系統流程。 2.流程控制由不少xml配置文件來實現,增長了出錯的機會,以及開發人員的要求 3.維護階段須要維護配置文件或者配置文件+代碼的混合體,這比單純地維護代碼要困難的多 4.spring的性能通常,由於存在不少配置文件,須要讀取這些文件來實現控制,性能略有損失。因此對於簡單的應用,不推薦使用spring。Spring用於較複雜的應用 5.調試不直觀,後期的Bug對應階段不容易判斷問題所在 XFire是一個開源的框架,能夠很是容易得與spring集成。能夠很簡單地發佈一個Web Service。能夠將Web 服務綁定到POJO,XMLBeans。 支持基於HTTP、JXS等多種協議訪問Web服務。 支持多種Web服務業界重要標準,例如SOAP、WSDL、Web服務尋址。 高性能的SOAP實現 服務器客戶端代碼輔助生成 Xfire使得WebService開發變得十分簡單 Xfire使用Stax解析XML,性能有了質的提升。 XFire是基於SOAP/WSDL協議的,沒法用於開發RESTful風格的Web Service Axis本質上就是一個SOAP引擎,提供客戶端,服務器端和網管SOAP操做的基本框架。但Axis並不徹底是一個SOAP引擎,它仍是一個獨立的SOAP服務器和一個嵌入Servlet引擎(例如Tomcat)的服務器。 Axis支持WSDL,提供轉化WSDL爲Java類的工具。提供例子程序。 Axis是與XFire並列的新一代Web Service框架,經過簡單的API支持Web Service各項標準協議。 XFire與Axis相比,優勢明顯。 支持一系列Web Service的新標準 使用Stax解釋XML,性能有了質的提升 容易上手,能夠方便快速地從pojo發佈服務 支持Spring 、Pico、Loom等容器 高性能SOAP棧設計 XFire比Axis1.3快2-6倍; XFire的響應時間是Axis1.3的1/2到1/5。 因此XFire比Axis相對受歡迎。 CXF 以上列舉的都是傳統的SOAP/WSDL模式的Web Service框架,接下來介紹幾種實現了RESTful風格的一些Web Service框架 Spring3.0之後已經實現了對RESTful的支持。主要表如今: 1.註釋,如@RequestMapping和@PathVariable,支持資源標識和URL映射 2.ContentNegotiatingViewResolver支持爲不一樣的MIME內容類型,並使用不一樣的表示方式。 3.使用類似的編程模型無縫地整合到原始的MVC層 @Controller publicclass EmployeeController { @RequestMapping(method=RequestMethod.GET, value="/employee/{id}") public ModelAndView getEmployee(@PathVariable String id) { Employee e = employeeDS.get(Long.parseLong(id)); return new ModelAndView(XML_VIEW_NAME, "object", e); } } 如上@RequestMapping註釋是Spring REST特性的關鍵所在。它指定所註釋的方法將處理哪一個HTTP方法(RequestMethod.GET)和哪一個URI(/employee/{id})。注意: 1.對於{id}佔位符,使用@PathVariable註釋能夠將{}內的值注入到函數的參數。 2.XML_VIEW_NAME爲employees,這是在<servlet-name>-servlet.xml中定義的 對於其餘方法是相似的。經過使用@RequestMapp註釋的功能,處理不一樣方法的代碼是很是類似的 @RequestMapping(method=RequestMethod.POST, value="/employee") public ModelAndView addEmployee(@RequestBody String body) { Source source = new StreamSource(new StringReader(body)); Employee e = (Employee) jaxb2Mashaller.unmarshal(source); employeeDS.add(e); return new ModelAndView(XML_VIEW_NAME, "object", e); } @RequestMapping(method=RequestMethod.PUT, value="/employee/{id}") public ModelAndView updateEmployee(@RequestBody String body) { Source source = new StreamSource(new StringReader(body)); Employee e = (Employee) jaxb2Mashaller.unmarshal(source); employeeDS.update(e); return new ModelAndView(XML_VIEW_NAME, "object", e); } @RequestMapping(method=RequestMethod.DELETE, value="/employee/{id}") public ModelAndView removeEmployee(@PathVariable String id) { employeeDS.remove(Long.parseLong(id)); List<Employee> employees = employeeDS.getAll(); EmployeeList list = new EmployeeList(employees); return new ModelAndView(XML_VIEW_NAME, "employees", list); } 在上面的代碼中,經過使用@RequestBody,HTTP請求的主體能夠做爲一個參數注入。 Spring3.0實現的RESTful Web Service仍然是基於MVC模型的,Control類中使用註釋來處理對應的請求,返回的結果仍是要提交到View層渲染輸出。在<servlet-name>-servlet.xml要配置內容協商服務。 <bean class="org.springframework.web.servlet.view .ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="xml" value="application/xml"/> <entry key="html" value="text/html"/> </map></property> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view .BeanNameViewResolver"/> <bean class="org.springframework.web.servlet.view .UrlBasedViewResolver"> <property name="viewClass" value= "org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </list> </property> </bean> 定義了兩個視圖解析器。BeanNameViewResolver是負責處理的application/xml的,而另外一個UrlBasedViewResolver則負責處理text/html。 用Spring3.0實現Restful Web Service的優缺點 1.擁有Spring的全部優勢以及缺點 2.URl的映射在Control類中實現,不容易看出整個URI的結構(Restful Web Service的核心就在於URI的設計),也不利於修改,耦合度高 3.返回內容的協商在View層中實現,由view層調用相應的頁面渲染,效率太低,而且意義不大,我認爲應該在Control類中直接調用便可。 在編寫Web Service時,我認爲View層能夠忽略,由於Web Service傳輸地都是數據,不是很須要View渲染。 Restlet也支持REST。 特色:徹底拋棄了Servlet API,做爲替代,本身實現了一套API。可以支持複雜的REST架構設計。 缺點: 1.雖然也能夠運行於Web容器中,可是難以利用Servlet和JSP等資源。還有由於須要另一套API和概念,學習成本較高。 2.徹底不支持服務器端的HTTP Session,強制徹底基於無狀態服務器模型來作開發。對於基於瀏覽器的應用來講,開發難度較高。 3.自身沒有包括與Spring的集成,可使用第三方代碼與Spring集成,集成難度較大。 4.文檔不豐富,學習起來較困難。 5.沒有內建的國際支持 優勢: 1.有內建的HTTP認證機制,不須要另外開發安全機制 2.靈活性較高,支持更多的REST概念,支持透明的內容協商,適合於開發更強大的REST組件 3.零配置文件,所有配置經過代碼完成 Cetia4是一個對REST提供完善支持的Web開發框架 特色:基於Servlet API開發,能夠運行於全部的Web容器中 優勢: 1.能夠充分利用Servlet API和JSP等資源,須要額外學習的概念較少,學習成本較低。 2.對於傳統的Web應用,可使用服務器端的HTTP Session;對於Web服務類應用,不使用HTTP Session,基於無狀態服務器模型作開發。 3.自身包括了對於Web MVC的支持 4.內建了本身特有的導航對象棧的概念,對於傳統的Web應用開發很是有幫助。 5. 提供了JSP標籤庫,對於傳統的基於HTML表單的Web開發很是有幫助。 6. 支持與SiteMesh相配合,由SiteMesh來支持頁面佈局的重用。 7. 內建有與Spring的集成,集成起來很是容易。 8. 配置文件徹底基於標準的web.xml,不須要額外的配置文件。大量使用默認配置,通常狀況下足以知足常見的需求。 9. 擁有很好的文檔。 10. 有內建的國際化支持。 缺點: 1.沒有內建的HTTP認證機制,須要本身開發安全機制。 2.對於內容協商的支持比較弱,僅支持HTML和XML格式的數據。須要加以擴展才能支持其它格式的表現 Axis2,同時支持SOAP和REST風格的Web Service。但缺點很明顯, 1.僅僅支持GET與POST方法 2.僅僅是以REST風格暴露出Web服務,數據格式仍然是包含SOAP封裝的XML 3.只支持同步的調用方式 4.僅僅提供了以SOAP方式暴露Web服務的最小化支持,不支持全面的REST架構設計。 sqlREST,特色:1.爲任何能夠經過JDBC訪問的數據庫提供Web服務訪問接口,自動將REST風格的HTTP請求轉換成數據庫SQL語句。2.基於Servlet API開發 缺點: 1.由於是REST風格的HTTP請求到SQL語句的直接映射,所以強制使用以SQL和關係數據庫爲中心的數據建模設計方法,不支持面向對象的設計。 2.由於資源的定義僅限於數據庫的表,難以實現更高層次的抽象,必然會致使很是細粒度的API。應用的性能以及可伸縮性都難以保證。 Sun正在致力於創建REST風格Web服務的規範,JAX—RS(Java API for RESTful Web Service) JAX-RS提供一些標註將一個資源類,一個 POJO Java類,封裝成Web資源。 @Path,標註資源類或方法的相對路徑 @GET,@PUT,@POST,@DELETE,標註方法是用的HTTP請求的類型 @Produces,標註返回的MIME媒體類型 @Consumes,標註可接受請求的MIME媒體類型 @PathParam,@QueryParam,@HeaderParam,@CookieParam。@MatrixParam,@FormParam分別標註方法的參數來自於HTTP請求的不一樣位置,例如@PathParam來自於URL的路徑,@QueryParam來自於URL的查詢參數,@HeaderParam來自於HTTP請求的頭信息,@CookieParam來自HTTP請求的Cookie。 Jersey是JAX-RS的參考實現,即Jersey不是基於Servlet API的,而是採用了JAX-RS API。 1.Jersey採用了Annotation機制,全部的HTTP相關的參數設置都採用標註實現,所以,在編程的時候咱們針對的仍然是POJO,體會不到分佈式或J2EE編程的痛苦,只須要了解一些關鍵的Annotation便可。 2.Jersey是一個開發的平臺,咱們能夠擴展本身的需求,好比在消息格式上,雖然Jersey已經提供了Java基本數據類型、JSON、XML等類型,咱們仍是能夠很容易地擴展本身的格式。 3.Jersey創建的服務能夠很簡單地部署到JDK6自帶的輕量級Server上,過程極其簡單 4.Jersey創建的服務能夠很是容易地部署爲Servlet,支持各類J2EE容器 5.Jersey能夠爲咱們編寫的服務自動生成WADL 6.支持Spring。