在前面的「5天學會jaxws-webservice教程」,咱們講了基本的jax-ws的使用。java
Jax-ws是業界公認的標準的webservice,它已經成爲了一個行業界標準,包括cxf,其實cxf也是調用的jax-ws爲標準的基於spring的webservice框架。web
同時,你們都知道世界上除了j2ee體系外,還存在.net體系,同時有過相關經驗的同事們也知道用ws-security無非就是涉及到「加密」,「解密」,而JAVA的x509所涉及到的證書,公鑰,私鑰與.net體系之間是沒法通用的。spring
可是webservice是因該屬於無所謂語言的一個標準,所以爲了讓j2ee的webservice與.net的webservice可以互相調用(固然包括ws-security裏的加密解密),SUN與微軟聯合推出了一個:WCF。apache
WCF是Windows Communication Foundation的縮寫,原來代號爲Indigo,它是MS爲SOA(Service Oriented Architecture 面向服務架構)而設計的一套完整的技術框架。利用它可以開發出分佈式(Distributed)應用程序,並且開發難度相比之前 的.NETRemoting和ASP.NETXML Web Service等都有了大幅度的下降。tomcat
那麼搞J2EE的人如何去支持這個WCF呢?咱們不可能去用.net的語言在J2EE工程中寫符合WCF的Webservice?架構
所以,SUN在jax-ws上推出了一套框架叫:metro,用於支持WCF的webservice.app
在下面的介紹中,咱們會先以一個jax-ws結合SSH框架的例子來做爲一個承上啓下的開頭,如今開始咱們的ws-security之旅吧。框架
該教程爲基礎篇,不涉及到QoS與wcf相關,只有閱讀完了本教程,才能過渡到真正的jax-ws的ws-security。真正的可擴展的符合wcf標準的WebserviceQoS會在另外一篇教程中(METRO)詳細介紹。分佈式
jaxws-spring-1.8.jar與xbean-spring-2.8.jar。測試
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:ws="http://jax-ws.dev.java.net/spring/core" xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd"> |
請注意紅色加粗部分。
<bean id="roleQuery" class="com.cts.pip.ws.RoleQuery" /> <wss:binding url="/roleQueryService"> <wss:service> <ws:service bean="#roleQuery" /> </wss:service> </wss:binding> |
ü 上面的描述,使得咱們的Spring容器根據JAVA類: com.cts.pip.ws.RoleQuery生成相應的wsdl。
ü 這邊的: wss:binding url映射的是咱們的web.xml中映射的相應的servleturl。
來看咱們的web.xml中如何去映射咱們的servleturl的:
<servlet> <servlet-name>jaxws-servlet</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jaxws-servlet</servlet-name> <url-pattern>/roleQueryService</url-pattern> </servlet-mapping> |
package com.cts.pip.ws; import javax.annotation.Resource; import javax.jws.WebMethod; import javax.jws.WebService; import org.apache.log4j.Logger; import com.cts.pip.dto.*; import java.util.*; import com.cts.pip.service.*; public class RoleQuery { protected Logger log = Logger.getLogger(this.getClass()); RoleService roleService;
@WebMethod public List<RoleDTO> getRoles(){ List<RoleDTO> roleList=new ArrayList<RoleDTO>(); try{ roleList=roleService.queryRole(); log.info("roleList Size====="+roleList.size()); return roleList; }catch(Exception e){ log.error(e); return null; } } } |
能夠看到,咱們的這個類,能夠直接annotation進一個由spring容器管理的service層,層咱們的webservice能夠集成spring,調用springcontext中管理的任何資源,相信這個實用階值會比較大吧,對吧?呵呵。
(如何編譯參考5天學會jaxws-webservice教程第一天)。
把這個web應用發佈到tomcat中去,啓動tomcat。
輸入:http://localhost:8080/backendmanagement/roleQueryService?wsdl
咱們能夠獲得wsdl的輸出。
打開soapui,生成一個soap測試客戶端:
測試一下咱們的soap測試客戶端:
能夠看到右邊咱們獲得了3條輸出,這就是webservice經過spring的service,spring的service經過hibernate的dao得到到數據的soap包。表明咱們的webservice服備端已經發布成功。
這邊如何編譯,如何引用wsdl生成客戶端所須要的stub一併濾過,詳細請參見:5天學會jaxws-webservice教程第一天中相關的內容,下面只給出實現的客戶端,在這邊咱們使用的polling方式的webservice客戶端。
package com.cts.pip.ws; import javax.xml.ws.*; import java.util.*; import com.cts.pip.ws.*; import ctsjavacoe.ws.fromjava.CollectionWS; import ctsjavacoe.ws.fromjava.RtnMethodResponse;
public class JAXWSSPRINGPollingClient { public static void main(String[] args) throws Exception { RoleQueryService service = new RoleQueryService(); RoleQuery port = service.getRoleQueryPort(); Response<GetRolesResponse> getRoleAsync = port.getRolesAsync(); while (!getRoleAsync.isDone()) { System.out.println("is not done"); } List<RoleDTO> rtnList = new ArrayList<RoleDTO>(); try { GetRolesResponse getRolesResponse = getRoleAsync.get(); rtnList = getRolesResponse.getReturn(); System.out.println("return size======" + rtnList.size()); for (RoleDTO r : rtnList) { System.out.println(r.getRoleId() + " " + r.getRoleName()); } } catch (Exception ex) { ex.printStackTrace(); } } } |