JAX-WS
在 JAX-WS中,一個遠(yuǎn)程調(diào)用可以轉(zhuǎn)換為一個基于XML的協(xié)議例如SOAP。在使用JAX-WS過程中,開發(fā)者不需要編寫任何生成和處理SOAP消息的代碼。JAX-WS的運(yùn)行時實(shí)現(xiàn)會將這些API的調(diào)用轉(zhuǎn)換成為對于SOAP消息。
在服務(wù)器端,用戶只需要通過Java語言定義遠(yuǎn)程調(diào)用所需要實(shí)現(xiàn)的接口SEI (service endpoint interface),并提供相關(guān)的實(shí)現(xiàn),通過調(diào)用JAX-WS的服務(wù)發(fā)布接口就可以將其發(fā)布為WebService接口。
在客戶端,用戶可以通過JAX-WS的API創(chuàng)建一個代理(用本地對象來替代遠(yuǎn)程的服務(wù))來實(shí)現(xiàn)對于遠(yuǎn)程服務(wù)器端的調(diào)用。
通過web service所提供的互操作環(huán)境,我們可以用JAX-WS輕松實(shí)現(xiàn)JAVA平臺與其他編程環(huán)境(.net等)的互操作。
JAX-WS與JAX-RPC之間的關(guān)系
Sun最開始的web services的實(shí)現(xiàn)是JAX-RPC 1.1 (JSR 101)。這個實(shí)現(xiàn)是基于Java的RPC,并不完全支持schema規(guī)范,同時沒有對Binding和Parsing定義標(biāo)準(zhǔn)的實(shí)現(xiàn)。
JAX-WS2.0 (JSR 224)是Sun新的web services協(xié)議棧,是一個完全基于標(biāo)準(zhǔn)的實(shí)現(xiàn)。在binding層,使用的是the Java Architecture for XML Binding (JAXB, JSR 222),在parsing層,使用的是the Streaming API for XML (StAX, JSR 173),同時它還完全支持schema規(guī)范。
?
?
目的:使用ejb3 的 @WebService ? 注解開發(fā)一個webservice服務(wù)端,然后使用JAX-WS 技術(shù)完成客戶端代碼的生成和調(diào)用
?
webservice 服務(wù)器端的開發(fā):
?
?
?
?
?
? 步驟1: 寫一個webservice 需要傳輸?shù)膶ο?
?
package cn.itcast.bean; import java.io.Serializable; public class Order implements Serializable{ private static final long serialVersionUID = -5898452101455689209L; private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
?
??
步驟2: 定義webservice服務(wù)器端需要暴漏的方法接口
?
package cn.itcast.service; import java.util.List; import cn.itcast.bean.Order; public interface OrderService { public String getUserName(String name); public Order getOrder(String orderid); public List<Order> getOrders(); }
?
?
?
? 步驟3: 定義暴漏方法的實(shí)現(xiàn)
?
?
package cn.itcast.service.impl; import java.util.ArrayList; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.jws.WebService; import cn.itcast.bean.Order; import cn.itcast.service.OrderService; /*使用這個注解,就可以這個會話bean中的方法暴漏成webservice方法 * 如果你只想暴漏其中的某些方法,你可以再想對外暴漏的方法上 * 加上@WebMethod 注解,那么沒有這個注解的方法就不會暴漏 * 成webservice方法了 * targetNamespace 命名空間 也就是wsdl中的 targetNamespace * name 端點(diǎn)接口的名稱 也就是wsdl中的portType name * serviceName 服務(wù)的名稱 * 不修改上面的3個屬性也沒關(guān)系,就是你發(fā)布的wsdl的可讀性差 * */ @WebService(targetNamespace="http://ws.itcast.cn",name="OrderService", serviceName="OrderServiceBean") @Stateless @Remote(OrderService.class) public class OrderServiceBean implements OrderService { public Order getOrder(String orderid) { Order order = new Order(); order.setId(orderid); order.setName("小鴨子"); return order; } public List<Order> getOrders() { List<Order> orders = new ArrayList<Order>(); Order order1 = new Order(); order1.setId("001"); order1.setName("小一"); Order order2 = new Order(); order2.setId("002"); order2.setName("小二"); orders.add(order1); orders.add(order2); return orders; } public String getUserName(String name) { return name; } }
?
?
?
?步驟4: ant 打包(build.xml,項目根目錄下)?
?
<?xml version="1.0" encoding="UTF-8"?> <!--.表示同一目錄 ..表示在上一目錄--> <project name="WebService" basedir="."> <property name="src.dir" value="${basedir}\src"/> <property environment="env"/> <property name="jboss.home" value="${env.JBOSS_HOME}"/> <property name="jboss.server.config" value="default"/> <property name="build.dir" value="${basedir}\build"/> <path id="build.classpath"> <fileset dir="${jboss.home}\client"> <include name="*.jar"/> </fileset> <pathelement location="${build.dir}"/> </path> <target name="prepare" > <delete dir="${build.dir}"/> <mkdir dir="${build.dir}"/> </target> <target name="compile" depends="prepare" description="編譯"> <javac srcdir="${src.dir}" destdir="${build.dir}"> <classpath refid="build.classpath"/> </javac> </target> <target name="ejbjar" depends="compile" description="創(chuàng)建ejb發(fā)布包"> <jar jarfile="${basedir}\${ant.project.name}.jar"> <fileset dir="${build.dir}"> <include name="**/*.class"/> </fileset> <!--把persistence.xml打包到META-INF目錄下--> <!--<metainf dir="${src.dir}\META-INF"></metainf>--> </jar> </target> <target name="deploy" depends="ejbjar" description="ejb發(fā)布"> <copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/> </target> <target name="undeploy" description="卸載ejb"> <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"/> </target> </project>
?
?
?
?
步驟5:驗證輸入 http://localhost:8080/jbossws/ ? ?找到 View a list of deployed services ? 點(diǎn)擊可以看到你發(fā)的webservice的wsdl文件
?
webservice 客戶端的開發(fā):
?
?
步驟1: 建立一個空的項目,從 https://jax-ws.dev.java.net/2.1.7/ ?下載 jax-ws,使用? java -jar JAXWS2.1.7-20090419.jar,解壓縮后會有l(wèi)ib ,講lib下的 jar包加到classpath下 ?
?
步驟2:使用ant 從服務(wù)器的wsdl 生成本地調(diào)用框架
?
?
<?xml version="1.0" encoding="UTF-8"?> <project name = "WSClient" default="wsclient" basedir ="."> <property name = "src.dir" value = "${basedir}/src"/> <path id="build.classpath" description="設(shè)置類路徑"> <fileset dir="${basedir}/lib"> <include name="*.jar"></include> </fileset> </path> <target name = "wsclient" description ="生成webservice客戶端代碼"> <taskdef name = "wsimport" classname ="com.sun.tools.ws.ant.WsImport" classpathref="build.classpath"/> <wsimport wsdl="http://127.0.0.1:8080/WebService/OrderServiceBean?wsdl" sourcedestdir="${src.dir}" package="cn.com.xinli.ws.client" keep="true" verbose ="true" destdir="${basedir}/bin"/> </target> </project>
?
?
?
?
步驟3:使用junit4 寫單元測試
?
?
package junit.test; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import cn.com.xinli.ws.client.Order; import cn.com.xinli.ws.client.OrderService; import cn.com.xinli.ws.client.OrderServiceBean; public class WSTest { private static OrderService orderService; @BeforeClass public static void setUpBeforeClass() throws Exception { OrderServiceBean orderServiceBean = new OrderServiceBean(); orderService =orderServiceBean.getOrderServicePort(); } @Test public void getUserName(){ System.out.println(orderService.getUserName("小明")); } @Test public void getOrder(){ Order order = orderService.getOrder("999"); System.out.println(order.getId()); System.out.println(order.getName()); } @Test public void getOrders(){ List<Order> orders = orderService.getOrders(); for(Order order : orders) System.out.println(order.getId()+","+order.getName()); } }
??
?
?
驗證: 保證服務(wù)器的wsdl 能正確訪問,調(diào)用單元測試就好了。
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
