JBoss核心Java Web服务

这篇博客文章涉及Web服务。 好吧,更确切地说,它处理JBoss上的“普通” java Web服务。 这意味着我们将创建一个没有任何其他框架(如CXF,Axis等)的Web服务。 JBoss它自己提供对Web服务的支持。 因此,如果您真的在尝试构建基本的Web服务(或者只是想了解Web服务并尝试其他事情),那么JBoss Web服务应该是一个很好的起点。 开始了!

网络服务

让我们首先谈谈它本身的Web服务。 什么是Web服务。 人们倾向于说Web服务不仅仅是远程方法调用(RMI)的过程。 实际上,这不仅仅与RMI有关。 Web服务是通过HTTP协议公开的端点(或单个端点)的集合。 为了与这些端点进行通信,我们必须创建客户端以访问端点。 Web服务端点和客户端之间的这种通信的最大优点是由SOAP协议指定的,该协议建立在HTTP协议(有时甚至是SMTP协议)的基础上。

该协议定义了在端点和客户端之间传输的数据的结构。 数据以XML格式交换。 结果,Web服务被称为独立于“平台/技术”。 例如,可以通过使用Java CXF框架或纯JBoss Web服务来实现Web服务。 可以在非Java环境中实现访问此Web服务的客户端。 Web服务技术和客户端技术可以完全不同,并且由于SOAP协议依赖于XML消息格式,因此它们之间仍可以进行通信。 要使通信成功,唯一需要做的事情就是端点和客户端都同意XML消息的外观(XML文件中将包含哪种字段和内容类型)以及进行哪些操作(方法),客户端可以在端点上调用。

这些要求由WSDL指定。 WSDL (Web服务描述语言)是一种基于XML的语言,用于描述Web服务的端点。 它可以定义端点的HTTP地址,客户端可以在此端点上执行的操作,可以传递给操作的数据类型以及从端点的那些操作返回的数据类型。 它还定义了与端点进行通信时使用的XML消息的确切结构。 这种信息通常以wsdl扩展名存储在文件中。 这就是著名的术语“ wsdl文件”如何出现的原因。

好的,关于Web服务就足够了。 实际上,我可以写很多有关Web服务和SOAP协议的信息,但这超出了本博客的范围。 鼓励您这样做。 互联网上有很多关于该主题的文章。

在JBoss上创建一个简单的Web服务

示例我将向您展示eclipse 3.7(indigo),我将使用JBoss 4.2.3.GA作为服务器。 作为项目构建工具,我将使用Maven。 让我们从在Eclipse中创建最简单的Web项目开始。 它将保存Web服务实现(端点)。

它只是普通Web应用程序的Maven项目。 没什么特别的。 如果您不想使用Maven,那也可以。 您可以使用自己喜欢的任何工具来创建简单的Web应用程序。
在本文中,我将不介绍如何创建此简单项目的详细信息。 相反,我将为您提供日食中项目结构的屏幕快照。

日食中的项目结构。

现在,让我们创建Web服务。 我们将采用“ 自下而上的方法 ”。 这意味着我们将首先开发一个实现类,然后再定义WSDL。 因此,让我们编写一个简单的java POJO类。 我们只是假装我们的Web服务将某种汽车ID作为参数并返回该汽车的价格。 如果我们输入不存在的汽车ID,则Web服务将返回相应的错误文本。

这里要注意的主要元素是CarWebService接口和CarWebServiceImpl类,它们实际上实现了端点接口。

让我们从CarWebService接口开始。 这是代码:

package ba.codecentric.webservice;import javax.jws.WebMethod;
import javax.jws.WebService;import ba.codecentric.webservice.model.CarResponse;@WebService
public interface CarWebService {@WebMethodpublic CarResponse getCarPrice(String carId);}

如您所见,这是一个普通的接口定义。 这里只有两件事需要注意:两个注释: @WebService@WebMethod 。 这些注释属于称为JAX-WS的技术领域。 JAX-WS是有关如何创建Web服务和客户端的规范,它们可以与RPC调用进行通信并交换基于XML的消息。 Java具有自己的JAX-WS实现,使我们能够使用这些简单的注释来定义Web服务端点。 您可以在此处阅读有关JAX-WS的更多信息。 在Java内部,该技术处理接收和解析XML消息(通常与SOAP协议交换)。 这使开发人员免去了许多小时的辛苦工作,因此开发人员不必花费时间编写代码来生成肥皂消息,发送它,然后在服务器端接收它,从xml中提取信息等。所有这些就是由Java中的JAX-WS机制在内部完成。

因此,当您希望在服务器上创建纯Java Web服务端点时,只需创建接口即可。 用WebService批注标记接口,并将接口中希望公开的所有方法标记为远程方法(带有WebMethod批注)。 然后,这些将成为可以在接口上调用的操作。 在我的示例中,我只有一种方法,但是可以有更多种方法。

下一站是创建接口实现。 我们已经公开了Web服务方法(端点的操作)。 这些方法必须执行某些操作才能使Web服务有意义。 在Java中,这非常简单。 我们将只为接口创建实现类。
我将向您展示CarWebServiceImpl的代码

package ba.codecentric.webservice.impl;import java.util.HashMap;
import java.util.Map;import javax.jws.WebService;import ba.codecentric.webservice.CarWebService;
import ba.codecentric.webservice.model.CarResponse;@WebService(endpointInterface = 'ba.codecentric.webservice.CarWebService')
public class CarWebServiceImpl implements CarWebService {private final Map<String, Integer> prices = new HashMap<String, Integer>();public CarWebServiceImpl() {prices.put('audi', Integer.valueOf(10000));prices.put('bmw', Integer.valueOf(15000));prices.put('fiat', Integer.valueOf(5000));}public CarResponse getCarPrice(String carId) {Integer price = prices.get(carId);CarResponse response = new CarResponse();if(price == null) {response.setCarPrice(-1);response.setStatus('error: no car with id: ' + carId);} else {response.setCarPrice(price.intValue());response.setStatus('ok');}return response;}}

再次需要注意的是特殊注释。 与界面相同,但只有一个额外的参数。 它是端点接口的标准名称。 没有其他的。
在现实世界中,此Web服务可能具有更复杂的代码。 它将需要某种汽车ID,然后将在数据库中搜索汽车。 但是在这里,我变得更加简单。 我有一张地图,其中包含三种不同的汽车ID,其中存储了ID的价格。

如果将现有的汽车ID传递给服务(例如audi,bmw),则将从服务器上的Web服务获得响应。 响应将包含状态消息(确定)和汽车价格。

如果您将不存在的汽车ID传递给服务,则您将收到状态错误的响应,并且还会有一个详细的字符串,告诉您未找到要搜索的汽车。 在这种情况下,汽车价格将设置为-1。

好。 就Web服务实现而言就是这样。 很简单,不是吗? 仅要做一件事。 而且这一过程更加简单。 您需要将实现类公开为Servlet。 您将在web.xml中执行此操作。 这是代码:

<servlet><servlet-name>carWebservice</servlet-name><servlet-class>ba.codecentric.webservice.impl.CarWebServiceImpl</servlet-class></servlet><servlet-mapping><servlet-name>carWebservice</servlet-name><url-pattern>/ws/car</url-pattern></servlet-mapping>

我们完成了。 现在,我们需要打包应用程序并将其部署到JBoss。
JBoss将为您发布此端点,因此您无需担心。
所以请继续。 将您的应用程序部署到JBoss。 如果您将maven用作构建工具,则pom.xml应该如下所示:

<build><finalname>webservices</finalName><plugins><plugin><groupid>org.apache.maven.plugins</groupId><artifactid>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins>
</build>

由于使用了注释,因此将Maven编译器的源版本和目标版本设置为Java 6。

JBoss拥有自己的小型Web应用程序,可让您查看当前部署的所有Web服务以及这些Web服务的所有WSDL文件的位置。
您可以从以下URL访问此小型应用程序: http:// localhost:8080 / jbossws / services
当然,只要您的JBoss服务器名称为localhost且其http端口配置为8080。

这是我的PC上的屏幕截图,清楚地表明了在此示例中部署的Web服务确实正在运行。

您可以单击端点的URL。 结果将是您实际上将看到端点的WSDL。 在该WSDL中,您将看到类似<import location ='……'>的内容 。 location属性的值是完整WSDL的真实URL。 所以请继续。 同时在浏览器中打开该URL。 现在,您应该看到整个WSDL(端点定义,可以调用的操作,发送到端点并从端点接收回的消息)。 我希望这可以使您更轻松地了解Web服务实际上是如何与客户端交换数据的。 客户端只是基于从Web服务获取的WSDL文件创建请求。 在该WSDL文件中,客户端可以看到与端点进行通信所需的所有内容。 SOAP协议和Java的JAX-WS机制负责其余所有工作。 开发人员不必查看其中已调用的操作。

创建一个简单的Web服务客户端(wsconsume实用程序)

为了调用此Web服务,我们需要创建一个客户端。 客户端可以是一个简单的Java控制台应用程序。 如果您不想使事情复杂化,它甚至不必是Web应用程序。 这意味着您可以使用main()方法创建一个简单的Java类。 只需几行代码,您就完成了。 我们在这里要做的第一件事是生成所谓的“存根类”。 这些类表示我们用于与Web服务通信的模型请求和响应类。 如果您还记得的话,我已经创建了一个特殊的包装器类来返回Web服务响应。 但是,这些存根类中不只是模型类。 在这里,您还将找到实际执行远程端点调用的类以及其他一些实用程序类。 另外,您还会发现将Java对象编组和解编为XML消息时所需的一些JAXB注释,反之亦然。 这些存根类是基于端点的WSDL文件创建的。 如果您还记得WSDL文件,则包含客户端需要的所有信息。 基于WSDL文件,我们可以生成所有必需的存根类(用于与Web服务通信的模型类和用于促进此通信的实用程序类)。 对我们来说幸运的是,JBoss有一个小的实用程序,我们将使用它来生成这些类。 对于这些存根类,我们不必编写任何代码。 我们还可以告诉该工具立即在工作空间中生成类。 真的很酷的东西。 因此,让我们试一试。 该工具称为wsconsume.bat ,位于JBoss文件夹– bin中。 对于Linux用户,有wsconsume.sh

首先,我将在Eclipse中为此生成一个不同的项目。 我将其称为ws-client 。 这是一个普通的Java项目。 您可以选择File-> New-> Java Project并使用所有默认设置。 好。 现在,我们准备创建存根类。 我们希望wsconsume实用程序将类立即放入Java源文件的src文件夹中。 并且我们还将告诉wsconsume实用程序应该用于这些类的软件包的确切名称。 我的项目位于此处: D:\ JBossTests \ jbossWebServiceWorkspace \ ws-client

因此,wsconsume utlity的命令应为:D:\ JBossTests \ jboss-4.2.3.GA \ bin> wsconsume -v -k -p ws.client.impl -s D:\ JBossTests \ jbossWebServiceWorkspace \ ws-client \ src

http://127.0.0.1:8080/webservices/ws/car?wsdl

确保您正在jboss bin文件夹中执行此命令。 否则,请确保您的路径上具有wsconsume.bat文件,以从任何文件夹访问该文件。
还要确保您的jboss正在运行,并且您要为其尝试生成客户端的Web服务已正确部署并正在运行。

让我们解释一下我在这里使用的参数:

-v:详细(如果有错误,则显示完整的错误堆栈跟踪);
-k:保留/生成Java源代码;
-p:软件包名称。 生成的类将立即获得给定的包; -s:源文件夹。 放置源文件的目录。 我在客户端项目中使用了源文件夹,这很有意义。

最后,我们有了端点的WSDL位置的URL。
您可以打开jboss URL http:// localhost:8080 / jbossws / services来查看当前已部署的所有Web服务以及所有WSDL URL。 您只需将所需的WSDL URL复制/粘贴到wsconsume实用程序的命令提示符下即可 在我们的例子中,这是我们先前创建的Web服务的位置。

现在转到eclipse并刷新新客户端项目中的src文件夹。 现在,您应该具有由wsconsume实用程序生成的某些类,并且这些类应位于指定的程序包中。 现在我们需要做的就是执行此客户端并将请求发送到Web服务。 只需再创建一个类即可。 我将其称为CarWebserviceClient 。 我将其放入单独的包装中。 此类将具有普通的java main方法。 软件包为ws.client.runner

package ws.client.runner;import ws.client.impl.CarResponse;
import ws.client.impl.CarWebService;
import ws.client.impl.CarWebServiceImplService;public class CarrWebserviceClient {public static void main(String[] args) {CarWebServiceImplService service = new CarWebServiceImplService();CarWebService port = service.getCarWebServiceImplPort();CarResponse audiPrice = port.getCarPrice('audi');System.out.println('audi price: ' + audiPrice.getCarPrice() + ' EUR; web service status: ' + audiPrice.getStatus());CarResponse fordPrice = port.getCarPrice('ford');System.out.println('ford price: ' + fordPrice.getCarPrice() + ' EUR; web service status: ' + fordPrice.getStatus());}}

如您所见,上面的代码非常简单。 您只需要实例化客户端,然后获取服务的端口即可。 我们可以通过调用具有相同名称的java方法来调用Web服务操作。 只需传递您想要的参数即可。 您可以将audibmwfiat用作硬编码的现有值。 您也可以尝试检索一些不存在的汽车ID的价格。 我在上面的示例中尝试过。
当然,不要忘了运行jboss并部署Web服务,以使其工作:-)

好吧,仅此而已。 这可能是继续进入基于SOAP的Web服务世界的一个不错的起点。 这是最基本的示例,通过使用JAX-WS API并在jboss支持Web服务的帮助下实现。

参考:来自JCG合作伙伴 Branislav Vidovi的JBoss上的Core Java Web Services ? 在极客的东西:-)博客上。


翻译自: https://www.javacodegeeks.com/2012/08/jboss-core-java-web-services.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE--for each

参考&#xff1a;http://blog.csdn.net/yasi_xi/article/details/25482173 学习多线程的时候实例化线程数组而挖掘出来的一直以来的理解误区 之前一直以为for each 本质上和for循环以及迭代器没什么区别 1 package foreach;2 3 public class ForeachDemo1 {4 5 public …

[BZOJ1726][Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1277 Solved: 607 [Submit][Status][Discuss]Description 贝茜把家搬到了一个小农场&#xff0c;但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景&#xff0c;不想那么快…

mysql 5.1.62_MySQL 5.5.62 安装方法(标准配置版)

1.此安装方法适用于绝大多数MySQL版本&#xff0c;首先在MySQL官网上下载好所需版本。2.(官网可能不太好找)在我的博客列表中有一篇是MySQL官网下载链接&#xff0c;直达下载界面&#xff0c;方便。3.下载。(安装版 MSI Installer)4.下载安装包然后双击开始安装选择同意协议并…

简化Java内存分析

作为一名典型的Java开发人员&#xff0c;除了遵循关闭连接&#xff0c;流等典型的最佳实践外&#xff0c;我从未监视过应用程序的内存使用情况。最近&#xff0c;我们在JBoss服务器中遇到了一些问题&#xff0c;不得不深入研究内存管理Java中最好的事情之一是&#xff0c;创建对…

nyoj 1129 Salvation 模拟

思路&#xff1a;每个坐标有四种状态&#xff0c;每个点对应的每种状态只能走一个方向&#xff0c;如果走到一个重复的状态说明根本不能走到终点&#xff0c;否则继续走即可。 坑点&#xff1a;有可能初始坐标四周都是墙壁&#xff0c;如果不判断下可能会陷入是死循环。 贴上测…

详解mysql数据库的启动与终止_详解MySQL数据库的启动与终止(一)

由于MySQL服务器具有多种安装分发&#xff0c;而且能够运行在多种操作平台之上&#xff0c;因此它的启动与停止的方法也多种多样。你可以根据实际情况使用其中的一种。在你安装、升级或者维护系统时&#xff0c;你可能需要多次启动和终止服务器&#xff0c;你需要了解启动和终止…

easyui 插入中间行

function inserrow() {var index_dx 0;var index_lt 0;var rows $(#dg).datagrid(getRows)//获取当前的数据行前期数据准备for (var i 0; i < rows.length; i) {if (rows[i][运营商] 电信) {index_dx i;dxptjss_dx parseInt(rows[i][短信平台接收数]);} else {index_…

使用JNA的透明JFrame

在“ 使JFrame透明”中&#xff0c;我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误&#xff0c;该文章中还显示了Eclipse中的解析。 现在&#xff0c;这里是使用Java本机的版本。 我使用Java本机访问&#xff08;JNA&#xff09;库来…

Problem: Query on the tree(二分+划分树)

题目链接&#xff1a; Problem: Query on the tree Time limit: 1s Mem limit: 64 MB Problem DescriptionThere is a tree with n node, labeled from 1 to n, and the root of the tree is 1. For every node i, if its father is j, its value vivj*i%20161119, the…

day04_09 while循环03

练习题: 3.如何输入一个如下的直角三角形,用户指定输出行数:(如果上下反转,右如何实现?) ********** 以下是自己的思路,没有按照上课老师的思路,反正经过不断的测试改进得出的算法 num int(input("请输入行数")) line 1 while line < num1:lie 1 while lie &l…

idal 创建springboot 项目_手把手的SpringBoot教程,SpringBoot创建web项目(四)

在实际的开发过程中&#xff0c;我们需要前端页面向Java端提交请求&#xff0c;这些请求一般分为get方式和post方式&#xff0c;不管是哪一种方式&#xff0c;一般都会携带一些参数。这一节&#xff0c;我们来演示一下如何给Controller传递参数。代码&#xff1a;RestControlle…

JavaOne 2012:Lambda之路

我最热切期待的JavaOne 2012演讲之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技术主题演讲中的Lambda味道仅增加了预期。 这是在希尔顿广场A / B举行的&#xff0c;距离我上次在金门大桥A / B / C参加的演讲仅几步之遥。 我原本希望打包相对较大的Plaza A / B&#xff08…

沉浸式go-cache源码阅读!

大家好&#xff0c;我是豆小匠。 这期来阅读go-cache的源码&#xff0c;了解本地缓存的实现方式&#xff0c;同时掌握一些阅读源码的技巧~ 1. 源码获取 git clone https://github.com/patrickmn/go-cache.git用Goland打开可以看到真正实现功能的也就两个go文件&#xff0c;ca…

CoreAnimation 变换

CoreAnimation 变换 CoreAnimation 目录 博客园MakeDown支持不佳,如有需要请进GitHub 本片博客主要内容: 仿射变换 - CGAffineTransform3D变换 - CATransform3D仿射变换 - CGAffineTransform CGAffineTransform 是用于二维空间的旋转,缩放和平移的属性.首先展示一个简单的样例,…

20170907wdVBA_GetCellsContentToExcel

WORD 加载项 代码模板 Dim cmdBar As CommandBar, cmdBtn As CommandBarControl Const cmdBtnCap As String "批量提取操作步骤"Sub AutoExec()Call DelCmdBtnCall AddCmdBtnEnd Sub Sub AutoExit()Call DelCmdBtn End SubSub AddCmdBtn()Set cmdBar Application.C…

mysql 5.7 mirror_Centos7 Docker离线部署Mysql5.7

1 环境信息查看系统内核[rootlocalhost /]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)2 虚拟机拉取镜像此处资源获取在虚拟机中进行&#xff0c;完成后上传到服务器安装2.1 拉取mysql5.7镜像[rootlocalhost /]# docker pull mysql:5.72.2 导出镜像[rootloc…

Java中的简单REST客户端

如今&#xff0c;大多数用于与某些服务器通信的移动应用程序都使用REST服务。 这些服务也是与JavaScript或jQuery一起使用的常见做法。 现在&#xff0c;我知道在Java中为REST服务创建客户端的2种方法&#xff0c;在本文中&#xff0c;我将尝试演示这两种方法&#xff0c;希望它…

3.20 下午

阅读《艺术学概论》 戏剧冲突是戏剧的灵魂 冲突包括&#xff1a;人物性格的冲突、行为的冲突、 思想感情的冲突乃至心理状态的冲突等等 转载于:https://www.cnblogs.com/bgd140206110/p/6590005.html

华为root工具_华为Mate9解锁后无法ROOT 需要手动刷入Recovery怎么办【解决方法】...

很多朋友手机到手之后&#xff0c;都希望能够ROOT使用更多的系统功能。近日有网友向小编询问&#xff0c;为何华为Mate9解锁后无法ROOT&#xff0c;明明已经通过官方的解锁教程解锁的&#xff0c;但是之后使用“大师”等第三方刷机工具&#xff0c;无法ROOT。其实ROOT的关键就在…

JAX-WS入门

JAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.eviac.blog.jax…