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="${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
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
EJB_开发EJB容器模型的WEB服务的更多相关文章
- 各I/O模型 对应Web服务应用模型(select,poll,epoll,kevent,"/dev/poll")
一.利用select多路复用I/O的Web服务应用模型 /* 可读.可写.异常三种文件描述符集的申明和初始化.*/ fd_set readfds, writefds, exceptionfds; F ...
- Android开发9:网络访问&Web服务开发
前言 啦啦啦各位小伙伴们好~ 一起进入我们今天的主题.今天我们将和大家学习网络访问和Web服务开发的相关知识,一起学习熟练使用 HttpURLConnection 访问 WebService,熟悉使用 ...
- 用python开发了一个简单apache web服务端范例,在win10 + apache2.4.9 + python3.5 测试成功
#!D:\Programs\Python\Python35-32\python.exe import cgi def htmlTop(): print("Content-type: ...
- 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转
如果你曾经负责开发企业ERP系统或者OA系统,工作流对你来说一定并不陌生.工作流(Workflow)是对工作流程及其各操作步骤之间业务规则 的抽象.概括.描述.工作流要解决的主要问题是:为实现某个业务 ...
- 【转】简述什么是Web服务(Web Service)技术?
Web Service 是在 Internet 上进行分布式计算的基本构造块,是组件对象技术在 Internet 中的延伸,是一种部署在Web 上的组件.它融合了以组件为基础的开发模式和 ...
- web服务器之nginx和apache的区别
① apache属于重量级的服务器,nginx属于轻量级的服务器; 区别在于对一些功能的支持,比如: pathinfo,php模块方面 ② nginx抗高并发能力强. 由于nginx采用的是异步非阻 ...
- docker 搭建 web 服务环境
docker容器虽然早就听说过,但是本人还真的没去用过,刚好看到相关的文章,就分享了下,有机会可以实践下...... 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都 ...
- Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)
Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...
- 如何测试Web服务.1
一.什么是web服务 web服务在简单术语中可被定义为通过安装了特定设备或服务器到另一装置或客户端应用程序通过WWW彼此通信后的应用程序(万维网)提供的服务. Web服务通常在计算机网络的应用层上使 ...
随机推荐
- Redis事务管理
用过其他关系型数据库(比如msql)的肯定都指定,在关系型数据库里面的事务可以保证多个命令操作要么同时成功,要么同时失败.并且在执行事务的时候,可以有隔离级别. 但是在Redis中的事务,只是保证事务 ...
- [SCOI 2016]背单词
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...
- 精力(power)
[问题描述]假设你有一个属性叫”精力值”, 这个属性的上限为 E, 一开始你的精力值为 E.每天结束时, 该属性会回复 R,但回复后不会超过上限 E. 现在有 N 天时间给你去工作, 若第 i 天花费 ...
- 以独立的语句将new对象置入智能指针
以独立的语句将newed对象置入智能指针: processWidget(std::tr1::share_ptr<Widget>(new Widget) , priority()); 我们在 ...
- ●BZOJ 3238 [Ahoi2013]差异
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...
- [BZOJ]1047 理想的正方形(HAOI2007)
真·水题.小C本来是不想贴出来的,但是有一股来自东方的神秘力量催促小C发出来. Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和 ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- 提高Mysql查询速度的一些建议(转).
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]
ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ...
- 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分
最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...