类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:










页面导航:
正文内容: 本文的预定作者应该对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