首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

EJB3.0学习小结(二)-EJB3.0容器模型的WEB服务

2012-10-17 
EJB3.0学习总结(二)--EJB3.0容器模型的WEB服务JAX-WS  JAX-WS规范是一组XML web services的JAVA API。JAX-W

EJB3.0学习总结(二)--EJB3.0容器模型的WEB服务
JAX-WS  JAX-WS规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。
  在 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 服务器端的开发:

?

?

EJB3.0学习小结(二)-EJB3.0容器模型的WEB服务

?

?

?

? 步骤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 客户端的开发:

EJB3.0学习小结(二)-EJB3.0容器模型的WEB服务

?

?

步骤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;@BeforeClasspublic static void setUpBeforeClass() throws Exception {OrderServiceBean orderServiceBean = new OrderServiceBean();orderService =orderServiceBean.getOrderServicePort();}@Testpublic void getUserName(){System.out.println(orderService.getUserName("小明"));}@Testpublic void getOrder(){Order order = orderService.getOrder("999");System.out.println(order.getId());System.out.println(order.getName());}@Testpublic void getOrders(){List<Order> orders = orderService.getOrders();for(Order order : orders)System.out.println(order.getId()+","+order.getName());}}

??

?

?

验证: 保证服务器的wsdl 能正确访问,调用单元测试就好了。

?

?

?

热点排行