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. jQuery(二)

    jQuery学完了!好用! 1.用定时器做的jquery里面的animate效果 <!DOCTYPE html> <html lang="en"> < ...

  2. JavaScript实现自定义短信模板

    自定义短信模板,要求:可以插入关键字,当然是可以在点击到文本域中的任意位置,关键字以中括号包裹的形式出现[关键字],删除关键字要整个关键都删掉,而不是自己全删除. 详细在简书中 http://www. ...

  3. iOS键盘覆盖输入框的处理.doc

    在一个多项输入界面上,会有多个UITextfield类型的输入框.为了滚动方面,我们会将他们一一添加到UITableView的cell中,从而组成一个可以上下滑动的数据输入界面. 但是字符输入是通过系 ...

  4. VB.NET版机房收费系统---七仙女之系统登录

    VB.NET第一版机房收费系统,告一段落,验收的时候.问题也是大大的存在,没实用上设计模式,什么触发器.存储过程,都没实用上.看看其她小伙伴的,七层实现登录?那是什么东东,相比較我的三层而言,多了两倍 ...

  5. JAVA中JNI的简单使用

    了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式.JAVA通过 ...

  6. struts2,hibernate,spring整合笔记(1)

    今天终于配置好了ssh框架的整合,记录下过程供参考 环境:window8.1,jdk1.7 ,带有javaee的eclipse,也就是说要能发布web项目,TOMCAT服务器,tomcat配置涉及到环 ...

  7. ASP.NET MVC 文件异步上传问题处理

    最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我 ...

  8. 关于DOS下启动MySQL时提示服务名无效

    主要原因:启动时:net start mysql 而打开服务后发现,本地服务中mysql这个服务实际名字为mysql55,故启动语句应为:net  start mysql55: 以下摘自课程提问: 你 ...

  9. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  10. poj 1595

    #include <iostream> #define N 10010 using namespace std; int a[N],b[N]; int prime(int a) { int ...