首页 > 代码库 > EJB_开发EJB容器模型的WEB服务

EJB_开发EJB容器模型的WEB服务

开发EJB容器模型的WEB服务

WEB服务

         Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言。而EJB属于Java平台的规范,尽管理论上可以跨平台,但实现起来比较复杂,所以其应用范围局限在了Java平台。它们两者的偏重点不一样,Web服务偏重的是这个系统对外提供什么功能,而EJB偏重的是如何使用一个个组件组装这些功能。就好比一个硬盘,它对外提供的是存储服务,这是Web服务的关注点,对于怎样组装这个硬盘,怎样构造这些小零件,Web服务并不关心,但这些却是EJB所关注的。

JavaEE为web service提供了两种不同的编程模型:EJB容器模型及Web容器模型,这里使用JAX-WS2.x规范(Java API for XML-based Web Services)介绍Web Service的开发。

  

步骤:

1.新建一个Web Service项目,新建JavaProject:WebService,导入EJBjar文件。

2.建立一个无状态会话Bean,发布到WebService。

新建接口OrderService在cn.hqu.service下,定义三个方法:

public interface OrderService {

    public abstract StringgetUseName(String name);

    public abstract OrdergetOrder(String orderId);

    public abstract List<Order>getOrders();

}

 

新建JavaBean:类Order在cn.hqu.bean下,有字段orderId、name。和getter、setter。

 

新建类OrderServiceBean实现接口OrderService在cn.hqu.service.impl:

package cn.hqu.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebService;

import cn.hqu.bean.Order;
import cn.hqu.service.OrderService; 
@Stateless
@Remote(OrderService.class)
public class OrderServiceBean implements OrderService {

	@Override
	public String getUseName(String name) {
		return name;
	}

	@Override
	public Order getOrder(String orderId) {
		Order order = new Order();
		order.setOrderId(orderId);
		order.setName("苏志达");
		return order;
	}

	@Override
	public List<Order> getOrders() {
		List<Order> persons = new ArrayList<Order>();
		Order order1 = new Order();
		order1.setOrderId("1");
		order1.setName("小苏1");
		
		Order order2 = new Order();
		order1.setOrderId("2");
		order1.setName("小苏2");
		
		persons.add(order1);
		persons.add(order2);
		return persons;
	}

}

在类上加@WebService,把这里面的所以方法变成WebService方法。

也可以标注需要暴露的方法,在方法上面加@WebMethod,其他没标注的就是不暴露为WebService方法的。

 

打包发布,使用Ant,拷贝一份ant,修改配置name为项目名。

 

执行deploy,将WebService发布到Jboss中。查看控制台发布成功。

 

进入Jboss的后台管理可以查看我们发布的WebService服务

http://localhost:8080/jbossws/  点击View a list ofdeployed services。

 

可以点击http://127.0.0.1:8080/WebService/OrderServiceBean?wsdl查看WebService的描述语言,可以通过WebService注解@Webservice的属性进行修改。

@WebService(targetNamespace="http://ws.hqu.cn",name="OrderService",

serviceName="OrderServiceBean")

发布deploy。

Web服务开发完成,接下来开发Web服务的客户端。

开发步骤如下:

1.      在应用的类路径下放入JAX-WS的jar文件拷贝到lib下(下载路径:https://jax-ws.dev.java.net) 。

2.      利用Web Service客户端生成工具生成辅助类。

3.      第三步:借助辅助类调用WebService。

 

创建一个客户端应用,新建Javaproject:WSClient,导入EJBJar。新建lib文件夹。

我们使用wsimport工具的Ant任务类生成辅助类

  

新建Ant配置文件:在项目根目录下新建build.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<project name="WSClient" default="wsclientgen" basedir=".">

   <property name="src.dir" value=http://www.mamicode.com/"${basedir}/src"/>

   <path id="build.classpath" description="设置类路径">

        <fileset dir="${basedir}/lib">

            <include name="*.jar"/>

        </fileset>

    </path>

    <target name="wsclientgen" description="生成webservice客户端辅助代码,执行后请刷新项目">

    <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"classpathref=http://www.mamicode.com/"build.classpath"/>

    <wsimport wsdl="http://127.0.0.1:8080/WebService/OrderServiceBean?wsdl"

          sourcedestdir="${src.dir}"package="cn.hqu.ws.client"keep="true"

          verbose="true"destdir="${basedir}/bin"/>

    </target>

</project>

 

 

执行Ant生成客户端调用的辅助代码

刷新客户端项目,可以看到生成的代码。

 

通过这些代码去调用Web服务,

新建一个单元测试调用Web服务:

public classWSTEst {

    @Test

    public void getUserName(){

       OrderServiceBeanservice = newOrderServiceBean();

       OrderServiceorderService = service.getOrderServicePort();

       System.out.println(orderService.getUseName("小明"));

    }

}

控制台输出小明 证明方法是调用成功的。

 

报错:javax.xml.ws.WebServiceException: No Content-type in the header!

原因及解决办法:

把JBoss4.2内的JBOSS_HOME/client目录下的一下文件复制到JBoss5.1内的JBOSS_HOME/lib/endorsed目录下,重启服务就可以了。

jboss-jaxrpc.jar

jboss-jaxws.jar

jboss-jaxws-ext.jar

jboss-saaj.jar

 

package juint.test;

import java.util.List;

import org.junit.Test;

import cn.hqu.ws.client.Order;
import cn.hqu.ws.client.OrderService;
import cn.hqu.ws.client.OrderServiceBean;

public class WSTEst {
	@Test
	public void getUserName(){
		OrderServiceBean service = new OrderServiceBean();
		OrderService orderService = service.getOrderServicePort();
		System.out.println(orderService.getUseName("小明"));
	}
	
	@Test
	public void getOrder(){
		OrderServiceBean service = new OrderServiceBean();
		OrderService orderService = service.getOrderServicePort();
		Order order =orderService.getOrder("111");
		System.out.println(order.getOrderId()+","+order.getName());
	}
	
	@Test
	public void getOrders(){
		OrderServiceBean service = new OrderServiceBean();
		OrderService orderService = service.getOrderServicePort();
		List<Order> orders =orderService.getOrders();
		for (Order order : orders) {
			System.out.println(order.getOrderId()+","+order.getName());
		}
	}
}


开发web服务的时候,返回list的时候,应该采用泛型的形式来定义,EJB容器内部才能对它进行解释,并把它翻译生成对应的xml里面的类型s

(http://127.0.0.1:8080/WebService/OrderServiceBean?wsdl)。

 代码:http://pan.baidu.com/s/1i39S4sP