- 浏览: 279373 次
- 性别:
- 来自: 东方水城
文章分类
最新评论
-
18335864773:
pageoffice 插件 可以实现 office文档的在线操 ...
Java调用com组件操作word -
coosummer:
推荐使用在线免费bug管理系统- bug 禅思:http:// ...
Bug管理工具 -
program_coco:
柠檬bug管理系统,一个在线的bug管理系统。www.lemo ...
Bug管理工具 -
影非弦:
这个in.read(data);//data是一个byte[] ...
Java串口通信总结 -
影非弦:
这个不详细啊,我弄了一天了,都没弄出来,总是出错,读信息的时候 ...
Java串口通信总结
SOA服务的基本实现方法—使用HTTP协议传输XML请求(POX-over-HTTP)
翻译自"Service Oriented Architecture with Java"(使用Java开发面向服务的架构)一书之第二章
[接上篇Web服务和SOA(一)] 现在,我们来看看如何使用 Java 实现 findById 这个 SOA 服务。我们将使用 JAXB 库来实现 XML 的自动绑定, JAXB 库已经包含在最新的 JDK6 中。因此,如果您使用的是 JDK6 ,您不需要下载额外的 jar 包,否则,您需要下载 JAXB ,并把它显式地加到您的服务器和客户端的类路径中。但是,因为下面的代码使用了 Java 注解功能 (Annotations) ,所以您需要 JDK5 或者更高版本编译和执行下面的代码。我们采用 Tomcat5.5 实现服务器端的 SOA 服务,实际上,我们只用了一个简单的 Servlet 来实现这个服务。
我们就动手写服务器和客户端的 Java 类来实现客户和服务器端的交互,这些类包括 Item 、 ItemAction 和 ItemActionResponse 。它们都是带有 Java 注解的 POJO 对象 (Plain Oil Java Objects) , Java 注解在 XML 序列化和反序列化的过程中起了很重要的作用,示例代码如下所示:
代码清单 3 – XML 和注解进行绑定
- @XmlRootElement (name= "Item" )
- public class Item {
- private int id;
- private String code;
- private String description;
- ... getter/setter methods omitted ...
- @XmlRootElement (name= "ItemAction" )
- public class ItemAction{
- private String method;
- private Item item; ...
- @XmlRootElement (name= "ItemActionResponse" )
- public class ItemActionResponse {
- private String retCode;
- private Item item; ...
下面的代码是服务实现的主要部分,所有实现代码都包含在
Servlet 的 doPost() 方法中,该 Servlet 在 Web.xml 中的 URL 映射名为 itemCrudService 。程序清单 4—itemCrudService 服务的服务器端实现
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException
- {
- try {
- JAXBContext jaxbContext = JAXBContext.newInstance (ItemAction. class , ItemActionResponse. class );
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- //Receiving the XML request and transform it into a Java object
- ItemAction itemAction = (ItemAction)
- unmarshaller.unmarshal(request.getInputStream());
- //Do some action depending on the request content
- String method = itemAction.getMethod();
- //Prepare the response as a Java object
- ItemActionResponse itemActionResponse = new ItemActionResponse();
- if ( "findById" .equals(method)){
- int id = itemAction.getItem().getId();
- //Retrieve item (e.g. from db)
- Item item = new Item();
- item.setId(id);
- item.setCode( "Item XYZ" );
- item.setDescription( "Description item XYZ" );
- //Fill the response
- itemActionResponse.setRetCode( "OK" );
- itemActionResponse.setItem(item);
- }
- Marshaller marshaller = jaxbContext.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
- Boolean.TRUE);
- //The following line is not required, it was inserted
- //just to see the content of the generated XML message
- marshaller.marshal(itemActionResponse, System.out);
- //Send the XML message to the client
- marshaller.marshal( itemActionResponse,
- response.getOutputStream());
- }
- catch (JAXBException e){
- throw new ServletException(e);
- }
- }
到现在为止,我们完成了一个基本服务的实现,其工作流程非常明了:
1. 把 XML 请求序列化
2. 进行处理操作
3. 准备和序列化应答 XML
请注意上面的服务可供任何语言和技术调用,只要客户端程序能够对 XML 进行序列化和反序列化及对信息交换的协议有所了解即可。
程序清单5 —itemCrudService 服务的客户端实现
- //Prepare the request
- ItemAction itemAction = new ItemAction();
- Item item = new Item();
- item.setId(26);
- itemAction.setMethod( "findById" );
- itemAction.setItem(item);
- //Prepare and establish the connection with the service
- URL url = new URL( "http://localhost/SoaBookPoxHttp/itemCrudService" );
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
- con.setDoOutput( true );
- //Set the HTTP request method
- con.setRequestMethod( "POST" );
- con.connect();
- JAXBContext jaxbContext = JAXBContext.newInstance (ItemAction. class , ItemActionResponse. class );
- Marshaller marshaller = jaxbContext.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
- //The following line is not required, it was inserted
- //just to see the content of the generated XML message
- marshaller.marshal(itemAction, System. out );
- //Send the XML request to the service
- marshaller.marshal(itemAction, con.getOutputStream());
- //Get the XML response from the service and deserialize it
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- ItemActionResponse itemActionResponse = (ItemActionResponse)
- unmarshaller.unmarshal(con.getInputStream());
- //Show the response content
- System. out .println( "retCode=" +itemActionResponse.getRetCode()+ "\r" +
- "id=" +itemActionResponse.getItem().getId()+ "\r" +
- "code=" +itemActionResponse.getItem().getCode()+ "\r" + "description=" +itemActionResponse.getItem() .getDescription());
通过以上代码您会看到,所有参与消息交换的类
( 包括 Item, ItemAction 及 ItemActionResponse) 对客户端必须是可见的。在本例中,客户端和服务器端都使用 Java ,因此我们只需要简单地这些类从服务器端的项目中拷贝到客户端的项目中即可。但一般说来,这并不是必需的 ( 请思考一下如果客户端和服务器端使用不同语言的情况 ) 。服务实现过程中唯一的要求就是,您要传输的对象必须满足序列化和反序列化的要求。我们可以使用同样的方法来实现 findAllItems 服务,为此,我们新建一个 Servlet ,这个 Servlet 不需要任何输入,并返回所有的商品列表。该服务的实现代码如下:程序清单 6—findAllItems 服务的服务器端实现
- protected void doPost(HttpServletRequest request,
- HttpServletResponse response)
- throws ServletException, IOException
- {
- try {
- JAXBContext jaxbContext = JAXBContext.newInstance (ItemList. class , Item. class );
- ItemList itemList = new ItemList();
- itemList.setList( new ArrayList());
- Item i1 = new Item();
- i1.set ... ;
- itemList.getList().add(i1);
- ... populate itemList ...
- Marshaller marshaller = jaxbContext.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
- Boolean.TRUE);
- //Just to see the content of the generated XML message
- marshaller.marshal(itemList, System.out);
- //Send the XML message to the client
- marshaller.marshal(itemList, response.getOutputStream());
- }
- catch (JAXBException e) {
- throw new ServletException(e);
- }
- }
请注意,这里我们还需要定义一个
ItemList 类,其代码如下:程序清单 7—ItemList 类的源代码
- import java.util.List;
- import javax.xml.bind.annotation.XmlRootElement;
- @XmlRootElement (name= "ItemList" )
- public class ItemList {
- private List list;
- ...
相应的客户端测试代码应如下所示:
程序清单 8— findAllItems 服务的客户端端测试代码
- URL url = new URL( "http://localhost/SoaBookPoxHttp/findAllItems" );
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
- con.setRequestMethod( "POST" );
- con.connect();
- //Void Request
- //Get Response
- JAXBContext jaxbContext = JAXBContext.newInstance (ItemList. class , Item. class );
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- ItemList itemList = (ItemList)
- unmarshaller.unmarshal(con.getInputStream());
- for (Iterator iterator = itemList.getList().iterator();
- iterator.hasNext();)
- {
- Item item = (Item) iterator.next();
- System.out.println( item.getId()+ " - " + item.getCode()+ " - " +
- item.getDescription());
- }
译者注:如果您想增加对
SOA 服务的理解,并有兴趣动手一试,请不妨补齐上面的源代码,看看能否在 Tomcat 中运行并通过测试。译者补齐了源代码并在 Tomcat6.0+Java6 的环境下测试通过,源代码的链接如下,供您参考。http://carllgc.blog.ccidnet.com/job-htm-action-download-itemid-777373-aid-86781.html
发表评论
-
Highcharts使用指南
2013-08-29 10:49 1362摘要 Highcharts图表控件是目前使用最为广泛的图 ... -
【转】Flash图表AnyChart应用教程九:创建图表模板
2012-12-14 09:34 1257创建 AnyChart 模板的思路是分离图表设置和数据部分,然 ... -
【转】Flash图表AnyChart应用教程八:创建向下钻取仪表盘
2012-12-14 09:34 1253用 AnyChart 创建向下钻取地图有两种方式:用AnyCh ... -
【转】Flash图表AnyChart应用教程七:自定义轴标签
2012-12-14 09:33 1356AnyChart 图表中的X,Y和任意轴可以自定义标签。本文就 ... -
【转】Flash图表AnyChart应用教程六:创建圆形仪表
2012-12-14 09:33 2109本教程将为你详细解析 ... -
【转】Flash图表AnyChart应用教程五:字体设置
2012-12-13 10:11 1563要设置AnyChart 图表上的字体,可以对AnyChart的 ... -
【转】Flash图表AnyChart应用教程四:如何改变轴标签属性
2012-12-13 10:08 1479有人问到如何自定义AnyChart 图表的轴标签属性,实际上, ... -
【转】Flash图表AnyChart应用教程三:在网页中嵌入flash地图
2012-12-13 10:06 1871AnyChart 是一款灵活的基于Flash/JavaScri ... -
【转】Flash图表AnyChart应用教程二:修改XML设置转换图表类型
2012-12-13 10:02 1139我们都知道,运用flash图表控件 AnyChart 可以创建 ... -
【转】Flash图表AnyChart应用教程一:创建交互式数字仪表盘
2012-12-13 09:51 1685仪表盘是商业智能领域必不可少的一个工具,然而大多数企业仪表盘目 ... -
Table操作(自定义)
2010-03-22 08:26 1211<table id="ccc" cl ... -
日志级别的选择:Debug、Info、Warn、Error还是Fatal
2008-12-17 14:09 10822软件中总免 ... -
SSO(Single Sign on)-单点登录
2008-12-15 12:36 1880目前的企业应用 ... -
Web服务和SOA(一) 上
2008-11-15 23:06 1456翻译自<<Service Oriented Arc ... -
Web服务和SOA(三) 上
2008-11-24 02:21 1068使用REST协议来实现SOA服务 REST是Represent ... -
Web服务和SOA(三) 下
2008-11-26 23:12 881至于deleteItem、findItemById和findA ... -
单点登录SSO
2008-12-15 10:23 1507摘要 :单点登录( SSO )的技术被越来越广泛地运用到各个领 ... -
应用整合中SSO的技术实现
2008-12-15 10:17 1812在税务行业信息化发展的关键阶段,应用整合已经非常重要,而应用整 ... -
Web服务和SOA(一) 下
2008-11-17 13:14 1055Web 服务、 REST 风格的服 ... -
Log4j的配置方法
2008-11-17 13:17 968Log4j的配置文件 虽然可以不用配置文件,而在程序 ...
相关推荐
在Java Web服务和SOA环境中,持续集成和部署工具如Maven、Gradle和Jenkins可以帮助自动化构建、测试和部署过程,确保服务的稳定性和质量。 ### 7. 监控与管理 使用工具如JMX(Java Management Extensions)和管理...
SOA与Web服务SOA与Web服务SOA与Web服务SOA与Web服务
使用Java Web服务构建SOA 中文版 part3
通过标准化的通信协议和服务接口,开发者可以构建出灵活、可扩展的系统,满足日益复杂和多样的业务需求。同时,服务的松散耦合确保了系统的稳定性,使得服务的升级和维护不影响消费者的使用体验。随着技术的不断发展...
web服务与SOA架构的一些简单的关系和一些联系!
( 用于实现Web服务的SOA编程模型.pdf )
在SOA中,SOAP消息用于在服务提供者和服务消费者之间传递请求和响应。Java中,可以使用JAX-WS(Java API for XML Web Services)来创建和消费SOAP Web服务。 **3. WSDL(Web Service Description Language)** WSDL...
JAX-WS提供了一套工具和API,使得开发人员能够轻松地实现服务端点和服务客户端。 4. **JAXB(Java Architecture for XML Binding)**:JAXB是一个用于在Java对象和XML之间进行映射的标准API。它可以自动将Java对象...
使用Java Web服务构建SOA 中文版 part1
SOA是一种软件设计方法,它将应用程序的不同功能单元通过定义良好的接口和服务边界进行分离,以促进重用和互操作性。Java Web服务在SOA中扮演着关键角色,因为它们提供了标准的、平台无关的方式来暴露和消费这些服务...
SOAP是一种基于XML的消息协议,它规定了消息的结构和交换规则,允许服务消费者和服务提供者之间进行安全、可靠的信息交换。例如,在清单2中展示的例子中,SOAP消息包含了一个信封,信封内封装了服务请求的具体内容,...
Java Enterprise Edition(Java EE)提供了一系列API和服务,如JAX-WS(Java API for XML Web Services),用于创建和部署Web服务。Java的EJB(Enterprise JavaBeans)和JSF(JavaServer Faces)等技术则支持企业级...
- **业务所有者**:希望通过 SOA 实现战略开发目标,例如增加新业务模型和服务等功能。 #### 技术要点 - **XML (Extensible Markup Language)**:一种用于标记数据的语言,是 Web 服务通信的基础。 - **SOAP ...
本书是一本方便的开发指南,可以帮助你在当前Java EE5和Java SE6平台上实现Web服务和面向服务的架构(SOA),介绍了如何创建、部署、以及调用Web服力,再将这些服务组合成松散耦合的SOA应用程序,并介绍了一个精心...
【语义网Web服务SOA】是信息技术领域中关于互联网服务和信息处理的重要主题,它涉及到Web服务的智能化和语义化,旨在提高信息共享和自动化处理的效率。以下是相关知识点的详细说明: 1. **服务的重要性**:互联网上...
- **快速应用集成**:SOA 的一个显著优点是能够快速集成现有的应用程序和服务,从而加速新应用的开发过程。 - **自动化业务流程**:通过SOA,可以将多个服务组合起来形成自动化的业务流程,减少人为干预,提高效率。...
5. 服务总线(Service Bus):作为服务之间的通信基础设施,它处理消息路由、事务管理、安全性和服务质量控制等问题。 Web服务是SOA的一种实现形式,使用HTTP协议来交换数据,这使得Web服务能够跨越防火墙,广泛...
本书是一本方便的开发指南,可以帮助你在当前Java EE5和Java SE6平台上实现Web服务和面向服务的架构(SOA),介绍了如何创建、部署、以及调用Web服力,再将这些服务组合成松散耦合的SOA应用程序,并介绍了一个精心...
本书是一本方便的开发指南,可以帮助你在当前Java EE5和Java SE6平台上实现Web服务和面向服务的架构(SOA),介绍了如何创建、部署、以及调用Web服力,再将这些服务组合成松散耦合的SOA应用程序,并介绍了一个精心...
本书是一本方便的开发指南,可以帮助你在当前Java EE5和Java SE6平台上实现Web服务和面向服务的架构(SOA),介绍了如何创建、部署、以及调用Web服力,再将这些服务组合成松散耦合的SOA应用程序,并介绍了一个精心...