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 version="1.0" encoding="ISO-8859-1"?>
- <!DOCTYPE web-app
- PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
- "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
- <web-app>
- <servlet>
- <servlet-name>DemoSend</servlet-name>
- <servlet-class>cody.soap.demo.DemoSend</servlet-class>
- </servlet>
- <servlet>
- <servlet-name>DemoReceiver</servlet-name>
- <servlet-class>cody.soap.demo.DemoReceiver</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>DemoSend</servlet-name>
- <url-pattern>/DemoSend</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>DemoReceiver</servlet-name>
- <url-pattern>/DemoReceiver</url-pattern>
- </servlet-mapping>
- </web-app>
DemoSend.java
- package cody.soap.demo;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.URL;
- import javax.activation.DataHandler;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.xml.soap.AttachmentPart;
- import javax.xml.soap.MessageFactory;
- import javax.xml.soap.SOAPBody;
- import javax.xml.soap.SOAPConnection;
- import javax.xml.soap.SOAPConnectionFactory;
- import javax.xml.soap.SOAPEnvelope;
- import javax.xml.soap.SOAPException;
- import javax.xml.soap.SOAPHeader;
- import javax.xml.soap.SOAPMessage;
- import javax.xml.soap.SOAPPart;
- public class DemoSend extends HttpServlet {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private SOAPConnection connection;
- @Override
- public void init() throws ServletException {
- super.init();
- try {
- SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance();
- connection = connectionFactory.createConnection();
- } catch (UnsupportedOperationException e) {
- e.printStackTrace();
- } catch (SOAPException e) {
- e.printStackTrace();
- }
- }
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String outString ="<HTML><H1>Sending and reading the SOAP Message</H1><P>";
- try {
- MessageFactory messageFactory = MessageFactory.newInstance();
- SOAPMessage outgoingMessage = messageFactory.createMessage();
- SOAPPart soappart = outgoingMessage.getSOAPPart();
- SOAPEnvelope envelope = soappart.getEnvelope();
- SOAPHeader header = envelope.getHeader();
- SOAPBody body = envelope.getBody();
- body.addBodyElement(envelope.createName("numberAvailable", "laptops", "http://ecodl.taobao.com/")).addTextNode("216");
- StringBuffer serverUrl = new StringBuffer();
- serverUrl.append(request.getScheme()).append("://").append(request.getServerName());
- serverUrl.append(":").append(request.getServerPort()).append(request.getContextPath());
- String baseUrl = serverUrl.toString();
- URL url = new URL(baseUrl + "/test.html");
- AttachmentPart attachmentpart = outgoingMessage.createAttachmentPart(new DataHandler(url));
- attachmentpart.setContentType("text/html");
- outgoingMessage.addAttachmentPart(attachmentpart);
- URL client = new URL(baseUrl + "/DemoReceiver");
- FileOutputStream outgoingFile = new FileOutputStream("out.msg");
- outgoingMessage.writeTo(outgoingFile);
- outgoingFile.close();
- outString += "SOAP outgoingMessage sent (see out.msg). <BR>"+baseUrl+"<BR>";
- SOAPMessage incomingMessage = connection.call(outgoingMessage, client);
- if (incomingMessage != null) {
- FileOutputStream incomingFile = new FileOutputStream("in.msg");
- incomingMessage.writeTo(incomingFile);
- incomingFile.close();
- outString += "SOAP outgoingMessage received (see in.msg).</HTML>";
- }
- } catch (SOAPException e) {
- e.printStackTrace();
- }
- try {
- OutputStream outputStream = response.getOutputStream();
- outputStream.write(outString.getBytes());
- outputStream.flush();
- outputStream.close();
- } catch (IOException e) {}
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req, resp);
- }
- }
DemoReceiver.java
- package cody.soap.demo;
- import java.util.Iterator;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.xml.messaging.JAXMServlet;
- import javax.xml.messaging.ReqRespListener;
- import javax.xml.soap.MessageFactory;
- import javax.xml.soap.SOAPBody;
- import javax.xml.soap.SOAPElement;
- import javax.xml.soap.SOAPEnvelope;
- import javax.xml.soap.SOAPException;
- import javax.xml.soap.SOAPMessage;
- import javax.xml.soap.SOAPPart;
- public class DemoReceiver extends JAXMServlet implements ReqRespListener{
- /**
- * Generated automatically
- */
- private static final long serialVersionUID = 1L;
- private static MessageFactory messageFactory = null;
- @Override
- public void init(ServletConfig servletConfig) throws ServletException {
- super.init(servletConfig);
- try {
- messageFactory = MessageFactory.newInstance();
- } catch (SOAPException e) {
- e.printStackTrace();
- }
- }
- @Override
- public SOAPMessage onMessage(SOAPMessage msg) {
- SOAPPart soappart = msg.getSOAPPart();
- try {
- SOAPEnvelope incomingEnvelope;
- incomingEnvelope = soappart.getEnvelope();
- SOAPBody body = incomingEnvelope.getBody();
- Iterator<?> iterator = body.getChildElements(incomingEnvelope.createName("numberAvailable", "laptops", "http://ecodl.taobao.com/"));
- SOAPElement element;
- element = (SOAPElement) iterator.next();
- SOAPMessage message = messageFactory.createMessage();
- SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
- SOAPBody responsebody = envelope.getBody();
- String responseText = "Got the SOAP message indicating there are " + element.getValue() + " laptops available.";
- responsebody.addChildElement(envelope.createName("Response")).addTextNode(responseText);
- return message;
- } catch (SOAPException e) {
- e.printStackTrace();
- return null;
- }
- }
- }
test.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <HTML>
- <HEAD>
- <TITLE>SOAP and Java</TITLE>
- </HEAD>
- <BODY>
- <H1>SOAP and Java</H1>
- Click <A HREF="DemoSend">here</a> to send the SOAP message.
- </BODY>
- </HTML>
out.msg
- ------=_Part_0_1985246804.1403343570084
- Content-Type: text/xml; charset=utf-8
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
- <SOAP-ENV:Header/>
- <SOAP-ENV:Body>
- <laptops:numberAvailable xmlns:laptops="http://ecodl.taobao.com/">216</laptops:numberAvailable>
- </SOAP-ENV:Body>
- </SOAP-ENV:Envelope>
- ------=_Part_0_1985246804.1403343570084
- Content-Type: text/html
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <HTML>
- <HEAD>
- <TITLE>SOAP and Java</TITLE>
- </HEAD>
- <BODY>
- <H1>SOAP and Java</H1>
- Click <A HREF="DemoSend">here</a> to send the SOAP message.
- </BODY>
- </HTML>
- ------=_Part_0_1985246804.1403343570084--
in.msg
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
- <SOAP-ENV:Header/>
- <SOAP-ENV:Body>
- <Response>Got the SOAP message indicating there are 216 laptops available.
- </Response>
- </SOAP-ENV:Body>
- </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的更多相关文章
- 使用CXF实现基于Soap协议的WebService
本文介绍使用CXF实现基于Soap协议的WebService(CXF的版本是3.0.0) 一. 前言 Java有三种WebService规范:Jax-WS,Jax-RS,Jaxm 1. Jax-WS( ...
- C#如何使用Soap协议调用WebService?
WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...
- [Java] webservice soap,wsdl 例子
java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...
- 09_httpclient测试SOAP协议
[工程截图]注意:无需使用Wsimport生成客户端代码 [HttpClient.java] import java.io.ByteArrayOutputStream; import java.io. ...
- webservice第二篇【自定义webservice服务、soa、uddi概念、soap协议】
自定义webservice服务 我们在上一章节中已经使用wsimport生成本地代理来调用webservice的服务了,其实我们自己写的web应用程序也是可以发布webservice的 我们发布了we ...
- SOAP协议初级指南 (一)
SOAP(Simple Object Access Protocal) 技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问.SOAP是把成熟的基于HTTP的WEB技 ...
- Android与服务器端数据交互(基于SOAP协议整合android+webservice)
http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端a ...
- soap协议有get方式
今天去面试,被问到了这个问题.一时没想起来.考官的说法是没有 get,使用post 发请求.restful 有get put delete等谓词. 特地查了一下.记在下边. <system.we ...
- 08_使用TCP/IP Monitor监视SOAP协议
[SOAP定义] SOAP 简单对象访问协议,基于http传输xml数据,soap协议体是xml格式.SOAP 是一种网络通信协议SOAP 即Simple Object Access Pr ...
随机推荐
- 苹果iOS操作系统整体架构层次讲解
iOS的系统架构分为四个层次:核心操作系统层(Core OS layer).核心服务层(Core Services layer).媒体层(Media layer)和可触摸层(Cocoa Touch ...
- linux杂谈(二十):apache服务配置
1.apache简单介绍 我们常常要浏览网页,提供这种服务是apache.提供apache服务的软件是httpd服务. Apache支持許多特性,大部分通过编译的模块实现.這些特性從伺服器 ...
- 与useradd命令相关的两个默认配置文件
Configuration Files for User Management Defaults When working with tools as useradd, some defaul ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- Linux crontab命令
--常用参数:crontab -l //查看当前用户下的cron任务crontab -e //编辑当前用户的定时任务crontab -u jo ...
- 字符串格式化 String.format() 案例
转换符 转换符 说 明 %s 字符串类型 %c 字符类型 %b 布尔类型 %d 整数类型(十进制 ...
- 《photoshop cc 新功能 生成图像资源》智能切图逆天啦!
作为一个前端工程师切图这个步骤是必不可少的,方式多种多样,有和切图工具的,也有是把要切的图层元素或者组直接新建保存成文件的,现在photoshop cc2015,可以让你轻松切图,摆脱繁琐的切图步骤. ...
- 使程序能够引入.json文件, 为网站添加 MIME 映射
确认启用了 MIME 映射,或使用命令行工具 appcmd.exe 为网站添加 MIME 映射. 若要设置 MIME 类型,请在 IIS Express 安装目录中运行以下命令: appcmd set ...
- 【C#学习笔记】二、面向对象编程
2.1 抽象类与接口 1)概念 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类 ...
- sql-----点点滴滴
from--------where-------groud by---------having----------select---------order by------------top --时间 ...