Java实现SOAP协议 之 HelloWorld

SOAP是把基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。

准备:

1. 准备一个web server。Tomcat 下载地址 http://tomcat.apache.org/

本例使用版本 apache-tomcat-7.0.54-windows-x64.zip

2. 写一个servlet send用来发送一个SOAP的message并添加一个附件。

3. 写一个servlet receive用来做SOAP message的解析并返回一个response。

4. 写一个简单的html页面触发 servlet A。

开发工具:

eclipse 版本 eclipse-jee-juno-SR2-win32-x86_64

下载地址:

http://www.eclipse.org/downloads/

下载J2EE版本的eclipse里面包含了SOAP常用的一些jar,但这个版本的没有jaxm-api.jar,这个需要额外下载

然后倒入。

代码结构:

web.xml代码如下:

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!DOCTYPE web-app
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  4. "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
  5. <web-app>
  6. <servlet>
  7. <servlet-name>DemoSend</servlet-name>
  8. <servlet-class>cody.soap.demo.DemoSend</servlet-class>
  9. </servlet>
  10. <servlet>
  11. <servlet-name>DemoReceiver</servlet-name>
  12. <servlet-class>cody.soap.demo.DemoReceiver</servlet-class>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>DemoSend</servlet-name>
  16. <url-pattern>/DemoSend</url-pattern>
  17. </servlet-mapping>
  18. <servlet-mapping>
  19. <servlet-name>DemoReceiver</servlet-name>
  20. <url-pattern>/DemoReceiver</url-pattern>
  21. </servlet-mapping>
  22. </web-app>

DemoSend.java

  1. package cody.soap.demo;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.net.URL;
  6. import javax.activation.DataHandler;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.xml.soap.AttachmentPart;
  12. import javax.xml.soap.MessageFactory;
  13. import javax.xml.soap.SOAPBody;
  14. import javax.xml.soap.SOAPConnection;
  15. import javax.xml.soap.SOAPConnectionFactory;
  16. import javax.xml.soap.SOAPEnvelope;
  17. import javax.xml.soap.SOAPException;
  18. import javax.xml.soap.SOAPHeader;
  19. import javax.xml.soap.SOAPMessage;
  20. import javax.xml.soap.SOAPPart;
  21. public class DemoSend extends HttpServlet {
  22. /**
  23. *
  24. */
  25. private static final long serialVersionUID = 1L;
  26. private SOAPConnection connection;
  27. @Override
  28. public void init() throws ServletException {
  29. super.init();
  30. try {
  31. SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance();
  32. connection = connectionFactory.createConnection();
  33. } catch (UnsupportedOperationException e) {
  34. e.printStackTrace();
  35. } catch (SOAPException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. @Override
  40. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  41. throws ServletException, IOException {
  42. String outString ="<HTML><H1>Sending and reading the SOAP Message</H1><P>";
  43. try {
  44. MessageFactory messageFactory = MessageFactory.newInstance();
  45. SOAPMessage outgoingMessage = messageFactory.createMessage();
  46. SOAPPart soappart = outgoingMessage.getSOAPPart();
  47. SOAPEnvelope envelope = soappart.getEnvelope();
  48. SOAPHeader header = envelope.getHeader();
  49. SOAPBody body = envelope.getBody();
  50. body.addBodyElement(envelope.createName("numberAvailable", "laptops", "http://ecodl.taobao.com/")).addTextNode("216");
  51. StringBuffer serverUrl = new StringBuffer();
  52. serverUrl.append(request.getScheme()).append("://").append(request.getServerName());
  53. serverUrl.append(":").append(request.getServerPort()).append(request.getContextPath());
  54. String baseUrl = serverUrl.toString();
  55. URL url = new URL(baseUrl + "/test.html");
  56. AttachmentPart attachmentpart = outgoingMessage.createAttachmentPart(new DataHandler(url));
  57. attachmentpart.setContentType("text/html");
  58. outgoingMessage.addAttachmentPart(attachmentpart);
  59. URL client = new URL(baseUrl + "/DemoReceiver");
  60. FileOutputStream outgoingFile = new FileOutputStream("out.msg");
  61. outgoingMessage.writeTo(outgoingFile);
  62. outgoingFile.close();
  63. outString += "SOAP outgoingMessage sent (see out.msg). <BR>"+baseUrl+"<BR>";
  64. SOAPMessage incomingMessage = connection.call(outgoingMessage, client);
  65. if (incomingMessage != null) {
  66. FileOutputStream incomingFile = new FileOutputStream("in.msg");
  67. incomingMessage.writeTo(incomingFile);
  68. incomingFile.close();
  69. outString += "SOAP outgoingMessage received (see in.msg).</HTML>";
  70. }
  71. } catch (SOAPException e) {
  72. e.printStackTrace();
  73. }
  74. try {
  75. OutputStream outputStream = response.getOutputStream();
  76. outputStream.write(outString.getBytes());
  77. outputStream.flush();
  78. outputStream.close();
  79. } catch (IOException e) {}
  80. }
  81. @Override
  82. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  83. throws ServletException, IOException {
  84. doGet(req, resp);
  85. }
  86. }

DemoReceiver.java

  1. package cody.soap.demo;
  2. import java.util.Iterator;
  3. import javax.servlet.ServletConfig;
  4. import javax.servlet.ServletException;
  5. import javax.xml.messaging.JAXMServlet;
  6. import javax.xml.messaging.ReqRespListener;
  7. import javax.xml.soap.MessageFactory;
  8. import javax.xml.soap.SOAPBody;
  9. import javax.xml.soap.SOAPElement;
  10. import javax.xml.soap.SOAPEnvelope;
  11. import javax.xml.soap.SOAPException;
  12. import javax.xml.soap.SOAPMessage;
  13. import javax.xml.soap.SOAPPart;
  14. public class DemoReceiver extends JAXMServlet implements ReqRespListener{
  15. /**
  16. * Generated automatically
  17. */
  18. private static final long serialVersionUID = 1L;
  19. private static MessageFactory messageFactory = null;
  20. @Override
  21. public void init(ServletConfig servletConfig) throws ServletException {
  22. super.init(servletConfig);
  23. try {
  24. messageFactory = MessageFactory.newInstance();
  25. } catch (SOAPException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. @Override
  30. public SOAPMessage onMessage(SOAPMessage msg) {
  31. SOAPPart soappart = msg.getSOAPPart();
  32. try {
  33. SOAPEnvelope incomingEnvelope;
  34. incomingEnvelope = soappart.getEnvelope();
  35. SOAPBody body = incomingEnvelope.getBody();
  36. Iterator<?> iterator = body.getChildElements(incomingEnvelope.createName("numberAvailable", "laptops", "http://ecodl.taobao.com/"));
  37. SOAPElement element;
  38. element = (SOAPElement) iterator.next();
  39. SOAPMessage message = messageFactory.createMessage();
  40. SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
  41. SOAPBody responsebody = envelope.getBody();
  42. String responseText = "Got the SOAP message indicating there are " + element.getValue() + " laptops available.";
  43. responsebody.addChildElement(envelope.createName("Response")).addTextNode(responseText);
  44. return message;
  45. } catch (SOAPException e) {
  46. e.printStackTrace();
  47. return null;
  48. }
  49. }
  50. }

test.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <HTML>
  4. <HEAD>
  5. <TITLE>SOAP and Java</TITLE>
  6. </HEAD>
  7. <BODY>
  8. <H1>SOAP and Java</H1>
  9. Click <A HREF="DemoSend">here</a> to send the SOAP message.
  10. </BODY>
  11. </HTML>

out.msg

  1. ------=_Part_0_1985246804.1403343570084
  2. Content-Type: text/xml; charset=utf-8
  3. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  4. <SOAP-ENV:Header/>
  5. <SOAP-ENV:Body>
  6. <laptops:numberAvailable xmlns:laptops="http://ecodl.taobao.com/">216</laptops:numberAvailable>
  7. </SOAP-ENV:Body>
  8. </SOAP-ENV:Envelope>
  9. ------=_Part_0_1985246804.1403343570084
  10. Content-Type: text/html
  11. <?xml version="1.0" encoding="UTF-8" ?>
  12. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  13. <HTML>
  14. <HEAD>
  15. <TITLE>SOAP and Java</TITLE>
  16. </HEAD>
  17. <BODY>
  18. <H1>SOAP and Java</H1>
  19. Click <A HREF="DemoSend">here</a> to send the SOAP message.
  20. </BODY>
  21. </HTML>
  22. ------=_Part_0_1985246804.1403343570084--

in.msg

  1. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  2. <SOAP-ENV:Header/>
  3. <SOAP-ENV:Body>
  4. <Response>Got the SOAP message indicating there are 216 laptops available.
  5. </Response>
  6. </SOAP-ENV:Body>
  7. </SOAP-ENV:Envelope>

原文:http://www.informit.com/library/content.aspx?b=STY_XML_21days&seqNum=228

在Tomcat上部署的目录结构:

webapps [This is a directory]
|____soapdemoserver [This is a directory]
     |____test.html [Our starting Web page]
     |____WEB-INF [This is a directory]
          |____web.xml [Configures Tomcat]
          |____classes [This is a directory]
               |____cody/soap/demo [This is a directory]
                    |____DemoReceiver.class [The server servlet]
                    |____DemoSend.class [The client servlet]

Java实现SOAP协议 之 HelloWorld的更多相关文章

  1. 使用CXF实现基于Soap协议的WebService

    本文介绍使用CXF实现基于Soap协议的WebService(CXF的版本是3.0.0) 一. 前言 Java有三种WebService规范:Jax-WS,Jax-RS,Jaxm 1. Jax-WS( ...

  2. C#如何使用Soap协议调用WebService?

    WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...

  3. [Java] webservice soap,wsdl 例子

    java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...

  4. 09_httpclient测试SOAP协议

    [工程截图]注意:无需使用Wsimport生成客户端代码 [HttpClient.java] import java.io.ByteArrayOutputStream; import java.io. ...

  5. webservice第二篇【自定义webservice服务、soa、uddi概念、soap协议】

    自定义webservice服务 我们在上一章节中已经使用wsimport生成本地代理来调用webservice的服务了,其实我们自己写的web应用程序也是可以发布webservice的 我们发布了we ...

  6. SOAP协议初级指南 (一)

    SOAP(Simple Object Access Protocal) 技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问.SOAP是把成熟的基于HTTP的WEB技 ...

  7. Android与服务器端数据交互(基于SOAP协议整合android+webservice)

    http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端a ...

  8. soap协议有get方式

    今天去面试,被问到了这个问题.一时没想起来.考官的说法是没有 get,使用post 发请求.restful 有get put delete等谓词. 特地查了一下.记在下边. <system.we ...

  9. 08_使用TCP/IP Monitor监视SOAP协议

    [SOAP定义] SOAP   简单对象访问协议,基于http传输xml数据,soap协议体是xml格式.SOAP   是一种网络通信协议SOAP   即Simple Object Access Pr ...

随机推荐

  1. Andrdoid中相应用程序的行为拦截实现方式之----从Java层进行拦截

    致谢: 感谢 简行之旅的这篇blog:http://blog.csdn.net/l173864930/article/details/38455951,这篇文章是參考这篇blog的进行一步一步操作的, ...

  2. 标C编程笔记day06 动态分配内存、函数指针、可变长度參数

    动态分配内存:头文件 stdlib.h     malloc:分配内存     calloc:分配内存,并清零     realloc:调整已分配的内存块大小     演示样例:         in ...

  3. 一些Android程序的反逆向方法

    1.检测调试器 在代码中检测调试器的动态调试 首先在AndroidMainfest.xml文件中设置android:debuggable="false",让程序不可调试.这样别人想 ...

  4. [转] gdb的基本工作原理

    转自: http://www.spongeliu.com/linux/howgdbwork/ 还是面某M的时候,面试官问我:“用过gdb么?” 答:“用过,调了两年bug了”.“那好,给我解释下gdb ...

  5. 【网络流#5】UVA 11082 最大流

    网络流题目最有意思的地方就是构图了,毕竟套模板每个人都会的 现在有一个矩阵,已知前i行元素之和a[i](1<=i<=n),前j列元素之和b[j](1<=j<=m),求一个可行的 ...

  6. 《fullPage.js》创建全屏滚动的网站

    插件介绍 fullPage.js是一个简单易用的插件,创建全屏滚动的网站(也被称为单页网站).它允许全屏滚动创建网站,以及添加内部滑块. 浏览器兼容性 主要功能 支持鼠标滚动 支持前进后退和键盘控制 ...

  7. sql server根据日期或者月份查询聚合数据

    /*****************************根据时间查询每天的数据***************************************/ @tm_start:开始时间 @tm ...

  8. h5 canvas

    概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap). 使用前,首先需要新建一个canvas网页元素. & ...

  9. linux free命令建检查内存状态

    前端时间发现博客服务器物理内存使用过高问题,就是使用linux free命令检查的,这次详细介绍下这个命令. 命 令: free 功能说明:显示内存状态.语 法: free [-bkmotV][-s  ...

  10. Android 如何调用自写APK和非自写APK

    由于项目需要,调用一个现成的APK,总结之余,顺便把怎么调用自写APK的方法也写上,以做比较 1.如何调用现成的APK: 先上调用代码,然后再一一解释: Intent mIntent = new In ...