Java实现SOAP协议 之 HelloWorld

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代码如下:

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

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

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

Html代码  

  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

Xml代码  

  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

Xml代码  

  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]
时间: 2024-10-10 00:02:20

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

android soap协议与webservice

今天偶然听说到soap协议的数据传输,没事就来看看,简单上网搜了下,总结如下: 首先,soap与http.socket都是一种数据传输协议,并不是说webservice一定要用soap协议,只不过webservice的主要目的是让数据进行跨平台传递,相当于两个应用或者服务之间的数据桥梁,而soap协议是xml的数据格式,几乎所有的主流的应用平台都可以使用,所以使用web+soap. 但是问题来了,xml的解析是非常消耗内存和cpu的,并不建议使用在手机上. 其次,我理解使用webservice的

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

此文出自:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端action请求数据.当然调用服务器端方法获取数据并不止这一种.WebService也可以为我们提供所需数据, 那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起. 我们在PC机器java客

09_httpclietn测试SOAP协议

[工程截图]注意:无需使用Wsimport生成客户端代码 [HttpClient.java] import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class HttpClient { public static void main(Str

iOS--对接soap协议接口

最近在对接soap协议接口,分别使用AFN和系统自带方法进行解析.soap协议具体是什么就不阐述了,可以自行百度. 说一下需要注意的地方: 1,iOS与soap协议接口对接,参数要传xml格式的字符串,具体格式看接口说明,务必保持一致: 2,soap1.1和soap1.2使用思路是一样的,但是设置的参数不一样,具体看代码: 3,soap协议的返回值也是xml格式的,需要进行xml解析,获取需要节点下的数据(这里强调一点,可以根据某个节点获取需要的数据,但是也可以不管xml的节点,直接通过根节点获

SOAP协议和基于SOAP的开发流程详述

[文章摘要] 简单对象访问协议(SOAP)是交换数据的一种协议规范,是一种轻量的.简单的.基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息. 在实际的软件开发项目中,SOAP大多用于处理用户数据,也即实现开户.销户.改户和查户等功能. 本文根据作者实际从事过的基于SOAP的项目开发,对SOAP协议和基于SOAP的开发流程进行了详细的介绍.希望大家通过此文,能够对基于SOAP协议的开发有一个全面的了解. 一.soapUI和SOAP代码生成框架简介 "工欲善其事,必先利其器"

Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar)

 该工具Jar包可在:http://download.csdn.net/detail/shenjianox/7769783及文档下载地址 ganymed-ssh2简介: Ganymed SSH-2 for Java是用纯Java实现SSH-2协议的一个包.在使用它的过程中非常容易,只需要指定合法的用户名口令, 或者授权认证文件,就可以创建到远程Linux主机的连接,在建立起来的会话中调用该Linux主机上的脚本文件,执行相关操作. 使用方法: 将 ganymed-ssh2-build210.

Java远程方法协议(JRMP)

Java远程方法协议(英语:Java Remote Method Protocol,JRMP)是特定于Java技术的.用于查找和引用远程对象的协议.这是运行在Java远程方法调用(RMI)之下.TCP/IP之上的线路层协议. JRMP是一个Java特有的.适用于Java之间远程调用的基于流的协议,要求客户端和服务器上都使用Java对象.

YII框架之soap协议的配置跟使用(Webservice)

Yii依靠文档注解(doc comments)和类反射(class reflection)来识别哪个方法可以被远程调用,包括他们的参数和返回值,但目前只能返回字符串,不能返回数组,若返回数组,则为"array";故我将返回值转换为json字符串再返回. 1. 定义Service Provider,服务器端文件代码,WebServerController.php <?php /****************************** * @author sara zhou *

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

[SOAP定义] SOAP   简单对象访问协议,基于http传输xml数据,soap协议体是xml格式.SOAP   是一种网络通信协议SOAP   即Simple Object Access Protocol简易对象访问协议SOAP   用于跨平台应用程序之间的通信SOAP   被设计用来通过因特网(http)进行通信SOAP   = HTTP+XML,其实就是通过HTTP发xml数据SOAP   很简单并可扩展支持面向对象SOAP   允许跨越防火墙SOAP   将被作为 W3C 标准来发