分享
 
 
 

深入探索SOAP1.1--使用SAAJ1.2.1

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本文的预定作者应该对SOAP1.1的基本规范有所了解,并熟悉了j2ee的基本开发,如果不熟悉的话,可以看一下我的Blog:使用SOAP开发java web服务--Axis开发方案 ,详细标准可以查看w3c的官方网站,连接如下:http://www.w3.org/TR/2000/NOTE-SOAP-20000508/ 。本文主要是探讨SAAJ(SOAP with Attachment API for Java),JAXM(Java API for XML Messaging),了解SOAP在j2ee开发中的作用与其接口。JAXM和SAAJ均支持针对B2B和Web服务应用程序、基于XML的消息交换,支持诸多行业标准,包括SOAP和ebXML。

SAAJ是JWSDP的组成部分之一,JWSDP目前已经更新到了1.5版,SAAJ可以从SUN的网站单独下载:http://java.sun.com/xml/downloads/saaj.html,JAXM是用于XML消息交换的标准,不在JWSDP1.5的发行包内,可以另外下载:http://java.sun.com/xml/jaxm/downloads/index.html ,由于SAAJ是基于JavaMailTM API (1.2) 、 JavaBeansTM Activation Framework (JAF) (1.1.3)和JAXP(1.2.6) 的,所以也要把他们下载下来,SUN的官方网站都有提供的,好了,现在我们得到了以下包(按我下载的名称):activation.jar(JAF),jaxm-api.jar(JAXM),mail.jar(JavaMail),saaj-api.jar(SAAJ),saaj-impl.jar(SAAJ),我的JAXP已经包括在jdk1.5中了。另外还要有个支持Servlet的容器。

好了,准备工作完毕了,下面开始我们的学习:

一、 SAAJ可用于将XML文档作为SOAP消息发送和接收,而无需JAXM提供商的基础程序结构,也无需处理基于SOAP的HTTP请求/响应。SAAJ最初是JAXM1.0API软件包的组成部分,而从JAXM1.1开始,该软件包更名为SAAJ1.1API。

以下我们先了解一个简单的SOAP1.1消息:

POST /StockQuote HTTP/1.1

Host: www.stockquoteserver.com

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "Some-URI"

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> <------------这是信封标志

<SOAP-ENV:Header> <------------这是消息头标志

<t:Transaction

xmlns:t="some-URI"

SOAP-ENV:mustUnderstand="1">

5

</t:Transaction>

</SOAP-ENV:Header>

<SOAP-ENV:Body> <------------这是主体标志

<m:GetLastTradePrice xmlns:m="Some-URI">

<symbol>DEF</symbol>

</m:GetLastTradePrice>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

SAAJ API为我们提供了一个高层次SOAP消息封装接口,如:信封接口:javax.xml.soap.SOAPEnvelope,并提供了操作getHeader(),该方法返回一个消息头:javax.xml.soap.SOAPHeader。所以,通过调用SAAJ的接口函数,我们就可以对SOAP消息进行操作。

二、现在我们来讨论一下在不使用消息交换提供程序的JAXM时,应用程序客户端通过SOAP直接与其远程伙伴发送和接收消息操作(定义了点到点的交互作用和同步通信模型,其中发送方和接收方以请求和响应的形式交换消息。发送方发送消息并等待锁定目标位置的响应)。

发送方步骤:

1)创建SOAP连接;

2)创建消息工厂;

3)创建消息;

4)填充消息;

5)添加消息;

6)添加SOAP附件;

7)发送消息并接收响应;

8)关闭提供程序连接;

一下是我写的一个例子:

/**

*Sender.java

*Copyright 2005-2-10

*/

import javax.xml.soap.SOAPConnectionFactory;

import javax.xml.soap.SOAPException;

import javax.xml.soap.SOAPConnection;

import javax.xml.soap.MessageFactory;

import javax.xml.soap.SOAPMessage;

import javax.xml.soap.SOAPPart;

import javax.xml.soap.SOAPEnvelope;

import javax.xml.soap.SOAPHeader;

import javax.xml.soap.SOAPBody;

import javax.xml.soap.SOAPBodyElement;

import javax.xml.soap.SOAPHeaderElement;

import javax.xml.soap.Name;

import javax.xml.soap.SOAPElement;

import java.net.URL;

import javax.xml.messaging.URLEndpoint;

import javax.activation.DataHandler;

import java.io.IOException;

public class Sender{

public SOAPMessage getMessage() throws SOAPException,Exception{

//消息工厂

MessageFactory msgFactory=MessageFactory.newInstance();

SOAPMessage message=msgFactory.createMessage();

//获得一个SOAPPart对象

SOAPPart soapPart=message.getSOAPPart();

//获得信封

SOAPEnvelope soapEnvelope=soapPart.getEnvelope();

//获得消息头

SOAPHeader soapHeader=soapEnvelope.getHeader();

//获得SOAP主体

SOAPBody soapBody=soapEnvelope.getBody();

//添加头元素

SOAPHeaderElement headerElement=soapHeader.addHeaderElement(

soapEnvelope.createName("StudentNo","stu","http://www.cun.edu.cn/jws"));

headerElement.addTextNode("JWS0229043");

//添加消息主体

Name bodyName=soapEnvelope.createName("getStudentInfo","stu","http://www.cun.edu.cn/jws");

SOAPBodyElement bodyElement=soapBody.addBodyElement(bodyName);

Name eleName=soapEnvelope.createName("StudentName");

SOAPElement se=bodyElement.addChildElement(eleName);

se.addTextNode("Wang wenyin");

//添加SOAP附件

URL url=new URL("http://img20.photo.163.com/gdanthrowwy/5123911/80707051.jpg");

DataHandler dataHandler=new DataHandler(url);//use the JAF

message.addAttachmentPart(message.createAttachmentPart(dataHandler));

//更新SOAP消息

message.saveChanges();

return message;

}

public void send(SOAPMessage message) throws SOAPException,IOException{

//创建SOAP连接

SOAPConnectionFactory scf=SOAPConnectionFactory.newInstance();

SOAPConnection sc=scf.createConnection();

//发送SOAP消息到目的地,并返回一个消息

URLEndpoint urlEndpoint=new URLEndpoint("http://localhost/saaj/StudentInfoServlet");

SOAPMessage response=sc.call(message,urlEndpoint);

if(response!=null){

//输出SOAP消息到控制台

System.out.println("Receive SOAP message from localhost:");

response.writeTo(System.out);

}else{

System.err.println("No response received from partner!");

}

sc.close();

}

public static void main(String[] args) throws SOAPException,Exception{

Sender sender=new Sender();

SOAPMessage message=sender.getMessage();

sender.send(message);

}

}

然后编译,注意classpath变量的设置要把以上的那些包加进去(可以设置一个脚本来完成,熟悉Ant的话,那就更加简单了)。

编译成功后,我们等到了一个Sender.class文件,这是发送方文件。当你运行java Sender的时候,就会把SOAP消息发向我们的同伴http://localhost/saaj/StudentInfoServlet ,并等待返回。以下我们继续编写一个Servlet好接收刚才发送的消息。

三、接收方Servlet应用程序saaj.war。

/**

*JAXMReceiveServlet.java

*Copyright 2005-2-10

*/

import javax.xml.messaging.JAXMServlet;

import javax.xml.messaging.ReqRespListener;

import javax.xml.soap.MessageFactory;

import javax.servlet.ServletException;

import javax.xml.soap.SOAPMessage;

import javax.xml.soap.SOAPEnvelope;

import javax.servlet.ServletConfig;

import java.io.FileOutputStream;

import java.io.File;

public class JAXMReceiveServlet extends JAXMServlet implements ReqRespListener{

static MessageFactory mf=null;

//创建一个消息工厂

static{

try{

mf=MessageFactory.newInstance();

}catch(Exception e){

e.printStackTrace();

}

};

public void init(ServletConfig sc) throws ServletException{

super.init(sc);

}

//处理传过来的SOAP消息,并返回一个SOAP消息

public SOAPMessage onMessage(SOAPMessage msg){

SOAPMessage resp=null;

try{

System.out.println("传入的消息:");

msg.writeTo(new FileOutputStream(new File("../webapps/soapmessage.xml")));

//创建一个返回消息

resp=mf.createMessage();

SOAPEnvelope se=resp.getSOAPPart().getEnvelope();

se.getBody().addChildElement(

se.createName("ResponseMessage")).addTextNode("Received Message,Thanks");

return resp;

}catch(Exception e){

e.printStackTrace();

}

return resp;

}

}

然后把相关的classpath添加进去,编译(不会的话,自己去查有关Servlet的编程,篇幅有限)

web.xml部署文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

version="2.4">

<servlet>

<servlet-name>StudentInfoServlet</servlet-name>

<servlet-class>JAXMReceiveServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>StudentInfoServlet</servlet-name>

<url-pattern>/StudentInfoServlet</url-pattern>

</servlet-mapping>

</web-app>

至此 我们的基本工作完成了,部署好程序saaj,当你在浏览器访问 http://localhost/saaj/StudentInfoServlet ,将会返回一个错误信息,因为这里使用的是SOAP协议。

四、测试

如果部署成功的话,那开始我们的测试。

我们继续第二步的步骤,java Sender,接着我们就等待,我们在发送方创建了一个SOAP消息(有个jpg图片的附件),并发送到Servlet容器中(我的是tomcat),在服务器方接送到消息,并在webapps文件夹下创建soapmessage.xml文件,把接收到的SOAP信息写进去,并返回一个soap消息。

等过了一段时间后,sender方会返回一个soap格式的xml文件,在控制台上输出。

好了,今天的关于SOAP的深入探索就到这里了。

如果对这篇文章有问题的话可以连续我:gdanthrowwy@126.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有