开发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="${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="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
class
WSTEst {

@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

EJB_开发EJB容器模型的WEB服务的更多相关文章

  1. 各I/O模型 对应Web服务应用模型(select,poll,epoll,kevent,"/dev/poll")

    一.利用select多路复用I/O的Web服务应用模型  /* 可读.可写.异常三种文件描述符集的申明和初始化.*/ fd_set readfds, writefds, exceptionfds; F ...

  2. Android开发9:网络访问&Web服务开发

    前言 啦啦啦各位小伙伴们好~ 一起进入我们今天的主题.今天我们将和大家学习网络访问和Web服务开发的相关知识,一起学习熟练使用 HttpURLConnection 访问 WebService,熟悉使用 ...

  3. 用python开发了一个简单apache web服务端范例,在win10 + apache2.4.9 + python3.5 测试成功

    #!D:\Programs\Python\Python35-32\python.exe import cgi def htmlTop():     print("Content-type: ...

  4. 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转

    如果你曾经负责开发企业ERP系统或者OA系统,工作流对你来说一定并不陌生.工作流(Workflow)是对工作流程及其各操作步骤之间业务规则 的抽象.概括.描述.工作流要解决的主要问题是:为实现某个业务 ...

  5. 【转】简述什么是Web服务(Web Service)技术?

          Web Service 是在 Internet 上进行分布式计算的基本构造块,是组件对象技术在 Internet 中的延伸,是一种部署在Web 上的组件.它融合了以组件为基础的开发模式和 ...

  6. web服务器之nginx和apache的区别

    ① apache属于重量级的服务器,nginx属于轻量级的服务器; 区别在于对一些功能的支持,比如:  pathinfo,php模块方面 ② nginx抗高并发能力强. 由于nginx采用的是异步非阻 ...

  7. docker 搭建 web 服务环境

    docker容器虽然早就听说过,但是本人还真的没去用过,刚好看到相关的文章,就分享了下,有机会可以实践下...... 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都 ...

  8. Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)

    Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...

  9. 如何测试Web服务.1

    一.什么是web服务  web服务在简单术语中可被定义为通过安装了特定设备或服务器到另一装置或客户端应用程序通过WWW彼此通信后的应用程序(万维网)提供的服务. Web服务通常在计算机网络的应用层上使 ...

随机推荐

  1. [SHOI2017]相逢是问候

    Description 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,a ...

  2. 【BZOJ1060】【ZJOI2007】时态同步

    Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...

  3. FZU 2158

    在密室逃脱游戏中,大家被困在一个密室中,为了逃出密室,需要找到正确的数字密码,于是大家分头行动,分别找到了密码的子序列,而后大家将得到的线索集中整理分析,大家想知道密码最少是多少位.  Input 第 ...

  4. 【无语凝噎(wordless)】

    ·题目:         西施与范蠡泛舟而去……不对,场景不对,咳咳.在甄嬛前往蓬莱洲之前,她与皇上在碧桐书院告别.为了这可能会长达数月的离别,两个人都似乎有很多话要对对方说,却都无语凝噎.这时,皇上 ...

  5. 全排列hash-康拓展开

    这是对很多全排列问题适用的方法,而且还能用于一些题目的判重 第一位是3,当第一位的数小于3时,那排列数小于321 如 123. 213 ,小于3的数有1.2 .所以有2*2!个.再看小于第二位2的:小 ...

  6. quartzJob 例子

    KpiOfPoorQualityJob.javapackage com.eastcom_sw.inas.workorder.quartzJob.kpi; import net.sf.json.JSON ...

  7. 在Unix系统中,主存索引节点和辅存索引节点从内容上比较有什么不同,为什么要设置主存索引节点?

    主存索引节点和辅存索引节点的不同主要体现在:主存索引节点状态:设备号.索引节点号:引用计数. 主存索引节点状态——反映主存索引节点的使用情况.它指示出: 1.  索引节点是否被锁上了: 2.  是否有 ...

  8. net use命令详解

    net use命令详解 1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连 ...

  9. DecimalFormat(用于格式化十进制数字)

    1概念: DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言.阿拉伯语和印度语数 ...

  10. 装 ubuntu + win10 出现 grub rescue 并处理之

    开机出现 grub rescue 原因:装 ubuntu + win10 双系统时有可能搞坏启动文件. grub rescue 隶属于 ubuntu管理. grub rescue 里可用命令很少,主要 ...