目的:使用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!