jboss4 java
网络服务
让我们首先谈谈它本身的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 {
@WebMethod
public 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服务操作。 只需传递您想要的参数即可。 您可以将audi , bmw和fiat用作硬编码的现有值。 您也可以尝试检索一些不存在的汽车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