jboss4 java_JBoss核心Java Web服务

jboss4 java

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

网络服务

让我们首先谈谈它本身的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应用程序。
在本文中,我将不介绍如何创建此简单项目的详细信息。 相反,我将为您提供Eclipse中项目结构的屏幕快照。

Eclipse中的项目结构。

现在,让我们创建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。

这是我的电脑的屏幕截图,清楚地表明了在此示例中部署的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

jboss4 java

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

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

相关文章

Java中的注解是如何工作的?

自Java5.0版本引入注解之后&#xff0c;它就成为了Java平台中非常重要的一部分。开发过程中&#xff0c;我们也时常在应用代码中会看到诸如Override&#xff0c;Deprecated这样的注解。这篇文章中&#xff0c;我将向大家讲述到底什么是注解&#xff0c;为什么要引入注解&#x…

android 广告弹出层,安卓广告活动弹窗控件 android-adDialog

软件介绍android-adDialog&#xff0c;一个简单、强大的广告活动弹窗控件。显示一个默认广告弹窗&#xff0c;支持单广告活动、多广告活动&#xff0c;当弹窗显示多广告是默认显示底部小圆圈&#xff0c;当显示单活动时默认不显示底部小圆圈&#xff1b;默认支持弹窗从上&#…

(企业 / 公司项目)如何使用分布式任务调度框架Quartz集成 和 SpringBoot自带的定时任务集成?

SpringBoot自带的定时任务 首先在你的微服务项目中创建一个新的模块&#xff0c;定时调度模块 pom.xml里面关联公共模块common的依赖其他不需要改变 然后启动类别删&#xff0c;启动项目是否报错&#xff0c;写一个简单的测试类访问路径是否成功 package com.jiawa.train.bat…

在Spring中配置多个View解析器

1.简介 在Spring中&#xff0c;提供了View Resolver来使用模型中可用的数据来解析视图&#xff0c;而无需与JSP&#xff0c;Velocity或Thymeleaf等View技术紧密绑定。 Spring可以根据需要轻松灵活地配置一个或多个View Resolver 。 2. Spring MVC应用程序流程 在继续理解多个V…

android 知识体系

转载于:https://www.cnblogs.com/mamamia/p/8567570.html

android电视root权限获取,电视盒子/ 智能电视如何通过ADB获取ROOT权限?

如何通过adb获取root权限(安卓电视盒和智能电视通用)?Android 系统rom里面最主要的就3个文件&#xff1a;boot.img、system.img、userdata.img其中boot.img 存放着内核以及Android系统的配置信息&#xff0c;比如android系统各文件夹的读写权限&#xff0c;adb 的权限。所以如…

确定活动的热点垃圾收集器

StackOverflow问题查找正在运行哪种类型的垃圾收集 器&#xff0c;jvm的默认垃圾收集器 &#xff0c; 如何通过查看gc日志来查看正在运行的垃圾收集器&#xff1f; &#xff0c;以及如何知道HotSpot jvm的当前GC策略&#xff1f; 和博客文章如何以编程方式获取GC信息表明了人们…

app store 关键词

如何选取关键字&#xff0c;让你的应用关键词越来越多&#xff1f; 很多朋友在做应用商店优化的时候&#xff0c;都会遇到一个让人很头疼的问题&#xff1a;如何选取关键词&#xff1f;关键词的质量直接关系到App的自然下载量&#xff0c;所以&#xff0c;我们应该用科学的办法…

android 调用微信语音识别,Android 仿微信语音识别

参考于&#xff1a;Android模仿微信语音聊天功能&#xff0c;这代码跑起来有问题&#xff0c;自己改动了一下&#xff0c;基本上没什么大问题先贴下效果图1、三个布局文件activity_main.xmldialog_manger.xmlitem_layout2.自定义的类(1)DialogMangerpackage com.nickming.view;…

老罗android oat,入门ART虚拟机(5)——OAT文件

Android安全交流群&#xff1a;478084054先贴老罗的一张图&#xff1a;再摘一段老罗的描述&#xff1a;“作为Android私有的一种ELF文件&#xff0c;OAT文件包含有两个特殊的段oatdata和oatexec&#xff0c;前者包含有用来生成本地机器指令的dex文件内容&#xff0c;后者包含生…

Dajngo-Xadmin 修改菜单摆放排序

问题: Xadmin 默认是读取了所有被注册到 xadmin 的模型生成对应的菜单!这个是没问题的 ,但是xadmin又对菜单做了 "通过菜单名称" 排序.英文状态下我们的排列至少是 a-z排列的,但是一到中文就乱了,完全不符合我们的要求. 解决办法: 要到达按照我们 在 django 的 setti…

华为鸿蒙2.0什么核心,鸿蒙系统2.0:安卓最核心部分基本已去除,将带来全新的体验...

早些时候&#xff0c;华为在东莞举办的华为2020华为开发者大会如期召开&#xff0c;在大会上华为正式发布了鸿蒙系统2.0&#xff0c;并称将于明年应用到智能手机上&#xff0c;其中升级了EMUI 11的用户可以优先获得体验鸿蒙系统2.0的资格&#xff0c;瞬间将会议推向高潮。值得一…

Java 8:在2分钟内将智能流与数据库一起使用

快速流媒体 当Java 8最终问世时&#xff0c;我和一些大学开始了一个开源项目&#xff0c;以利用Java 8的流库使整个Java / DB问题进一步向前发展&#xff0c;以便将数据库表视为纯Java 8流。 速度诞生了&#xff01; 哇&#xff0c;现在我们可以做类型安全的数据库应用程序了&a…

MapReduce 详解

MapReduce的整个运行分为两个阶段&#xff1a; Map和Reduce Map阶段由一定数量的Map Task组成 输入格式的数据格式化&#xff1a;InputFormat 数日数据的处理:Mapper 数据分组&#xff1a;Partitioner 下面流程图&#xff1a; 1. Map task 首先从HDFS上Read文件&#xff0c;通过…

早期访问中具有NetBeans的Oracle公共云Java服务

谁期望发生这种情况&#xff1a;Oracle正在开发公共云产品&#xff0c;并且即将开始正式启动的迹象已经出现。 在正式宣布之后将近一年&#xff0c;我被邀请加入所谓的“抢先体验”计划&#xff0c;以试驾新服务并提供反馈。 多亏负责产品的经理Reza Shafii &#xff0c;我才可…

HTML5调整图像垂直边距,77.通过vspace和hspace属性可以分别调整图像的垂直边距和水平边距。()()...

具有东方建筑特色、&#xff0e;通图像规模宏大、气势雄伟的古代建筑群是( )属性水平完成规定的大作业分别Which of the following parks are the urban parks of New York?调整的垂Which of the following countries have once occupied New York city in the 17th century?…

Javac可以编译,Java显示找不到或无法加载主类

运行时候加入完整包名。转载于:https://www.cnblogs.com/theWinter/p/8594354.html

台式计算机欢迎界面下不去,Win7系统开机不显示欢迎界面的方法

现在办公人员做事情都讲究效率&#xff0c;甚至连电脑开机都不放过&#xff0c;win7系统加快开机速度的方法有很多种&#xff0c;开机不显示欢迎界面便是其中之一。有些用户觉得开机显示欢迎界面是非常浪费时间的一件事&#xff0c;想要删除电脑中的欢迎界面。但是很多电脑白不…

CompressedOops:Java压缩参考简介

在本文中&#xff0c;我们将向您介绍一种称为Compressed oops的JVM优化。 压缩oop的概念是由32位和64位体系结构之间的差异引起的。 因此&#xff0c;我们将对64位体系结构进行简短的回顾&#xff0c;然后再深入探讨压缩oop的主题。 最后&#xff0c;我们将通过一个简单的示例看…

NYOJ90 整数划分(经典递归和dp)

整数划分 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c; 其中n1≥n2≥…≥nk≥1&#xff0c;k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。…