JAX-WS
在 JAX-WS中,一個遠程調用可以轉換為一個基于XML的協議例如SOAP。在使用JAX-WS過程中,開發者不需要編寫任何生成和處理SOAP消息的代碼。JAX-WS的運行時實現會將這些API的調用轉換成為對于SOAP消息。
在服務器端,用戶只需要通過Java語言定義遠程調用所需要實現的接口SEI (service endpoint interface),并提供相關的實現,通過調用JAX-WS的服務發布接口就可以將其發布為WebService接口。
在客戶端,用戶可以通過JAX-WS的API創建一個代理(用本地對象來替代遠程的服務)來實現對于遠程服務器端的調用。
通過web service所提供的互操作環境,我們可以用JAX-WS輕松實現JAVA平臺與其他編程環境(.net等)的互操作。
JAX-WS與JAX-RPC之間的關系
Sun最開始的web services的實現是JAX-RPC 1.1 (JSR 101)。這個實現是基于Java的RPC,并不完全支持schema規范,同時沒有對Binding和Parsing定義標準的實現。
JAX-WS2.0 (JSR 224)是Sun新的web services協議棧,是一個完全基于標準的實現。在binding層,使用的是the Java Architecture for XML Binding (JAXB, JSR 222),在parsing層,使用的是the Streaming API for XML (StAX, JSR 173),同時它還完全支持schema規范。
?
?
目的:使用ejb3 的 @WebService ? 注解開發一個webservice服務端,然后使用JAX-WS 技術完成客戶端代碼的生成和調用
?
webservice 服務器端的開發:
?
?
?
?
?
? 步驟1: 寫一個webservice 需要傳輸的對象
?
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服務器端需要暴漏的方法接口
?
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: 定義暴漏方法的實現
?
?
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 端點接口的名稱 也就是wsdl中的portType name
* serviceName 服務的名稱
* 不修改上面的3個屬性也沒關系,就是你發布的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="創建ejb發布包">
<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發布">
<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 ? 點擊可以看到你發的webservice的wsdl文件
?
webservice 客戶端的開發:
?
?
步驟1: 建立一個空的項目,從 https://jax-ws.dev.java.net/2.1.7/ ?下載 jax-ws,使用? java -jar JAXWS2.1.7-20090419.jar,解壓縮后會有lib ,講lib下的 jar包加到classpath下 ?
?
步驟2:使用ant 從服務器的wsdl 生成本地調用框架
?
?
<?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="設置類路徑">
<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());
}
}
??
?
?
驗證: 保證服務器的wsdl 能正確訪問,調用單元測試就好了。
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

