目的:使用ejb3 的 @WebService 注解开发一个webservice服务端,然后使用JAX-WS 技术完成客户端代码的生成和调用
webservice 服务器端的开发:

步骤1: 写一个webservice 需要传输的对象
package cn.com.xinli.bean;
import java.io.Serializable;
public class Order implements Serializable
{
String orderid;
String name;
public String getOrderid()
{
return orderid;
}
public void setOrderid(String orderid)
{
this.orderid = orderid;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
步骤2: 定义webservice服务器端需要暴漏的方法
package cn.com.xinli.service;
import java.util.List;
import cn.com.xinli.bean.Order;
public interface OrderService
{
public String getUserName(String name);
public Order getOrder(String id);
public List<Order> getOrders();
}
步骤3: 定义暴漏方法的实现
package cn.com.xinli.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import cn.com.xinli.bean.Order;
import cn.com.xinli.service.OrderService;
/*使用这个注解,就可以这个会话bean中的方法暴漏成webservice方法
* 如果你只想暴漏其中的某些方法,你可以再想对外暴漏的方法上
* 加上@WebMethod 注解,那么没有这个注解的方法就不会暴漏
* 成webservice方法了
* targetNamespace 命名空间 也就是wsdl中的 targetNamespace
* name 端点接口的名称 也就是wsdl中的portType name
* serviceName 服务的名称
* 不修改上面的3个属性也没关系,就是你发布的wsdl的可读性差
* */
@WebService(targetNamespace="http://xinli.com.cn",name="OrderService",
serviceName="OrderServiceBean")
/*声明为无状态的会话bean 声明远程接口*/
@Stateless
@Remote(OrderService.class)
public class OrderServiceBean implements OrderService
{
public Order getOrder(String orderid)
{
Order order=new Order();
order.setOrderid(orderid);
order.setName("亮亮娃");
return order;
}
public List<Order> getOrders()
{
List<Order> persons=new ArrayList<Order>();
Order order1=new Order();
order1.setOrderid("001");
order1.setName("huxl");
Order order2=new Order();
order2.setOrderid("002");
order2.setName("ryp");
persons.add(order1);
persons.add(order2);
return persons;
}
public String getUserName(String name)
{
return name;
}
}
步骤4: ant 打包
<?xml version="1.0" encoding="UTF-8"?>
<project name="Ejb3Webservice" basedir=".">
<property name="src.dir" value="${basedir}"/>
<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="master-classpath" description="设置编译路径">
<fileset file="${jboss.home}\client\*.jar"/>
</path>
<target name="prepare" description="创建class文件目录">
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}"/>
</target>
<target name="compile" depends="prepare" description="编译">
<!--只编译以cn开头的-->
<javac srcdir="${src.dir}" destdir="${build.dir}" includes="cn/**">
<classpath refid="master-classpath"/>
</javac>
</target>
<target name="ejbjar" description="创建ejb发布包" depends="compile">
<jar jarfile="${basedir}\${ant.project.name}.jar">
<fileset dir="${build.dir}"/>
<include name="**/*.class"/>
</jar>
</target>
<target name="deploy" description="发布">
<copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
</target>
<target name="undeploy" description="卸载ejb">
<delete file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
</target>
</project>
步骤5:验证输入 http://localhost:8080/jbossws/ 找到 View a list of deployed services 点击可以看到你发的webservice的wsdl文件
<!--li><a href="depends" mce_href="/admin/blogs/440338/depends">View installed dependencies</a></li-->
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/Ejb3Webservice/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
{
@BeforeClass
public static void setUpBeforeClass() throws Exception
{
}
@Test
public void getUserName()
{
OrderServiceBean orderServiceBean=new OrderServiceBean();
/*得到端点接口*/
OrderService orderService=orderServiceBean.getOrderServicePort();
System.out.println(orderService.getUserName("晓亮"));
}
@Test
public void getOrder()
{
OrderServiceBean orderServiceBean=new OrderServiceBean();
/*得到端点接口*/
OrderService orderService=orderServiceBean.getOrderServicePort();
System.out.println(orderService.getOrder("1").getOrderid());
System.out.println(orderService.getOrder("1").getName());
}
@Test
public void getOrders()
{
OrderServiceBean orderServiceBean=new OrderServiceBean();
/*得到端点接口*/
OrderService orderService=orderServiceBean.getOrderServicePort();
List<Order> orderList=orderService.getOrders();
for(Order order:orderList)
{
System.out.println(order.getOrderid());
System.out.println(order.getName());
}
}
}
验证: 保证服务器的wsdl 能正确访问,调用单元测试用例 ok!