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。