最近项目需要用到SOAP以及AXIS2的知识,在学习之余,将第一天学到的内容整理了一下,一来做为笔记做个记录,二来如果有需要的,可以做为参考,今天主要是完成了一下功能,通过一个SOAP请求消息(可以自己构造也可以通过指定一个xml文件),然后在Web Service中获取这个SOAP请求消息(一个OMElement对象),通过解析这个对象,获取需要的信息,然后对这些信息进行业务处理,最后返回一个SOAP响应消息。
获取AXIS2 1.1,由于做项目一般使用稳定的发布版本,所以本文没有使用最新的AXIS2 1.1.1版本,该版本可以从Apache官方网站下载。下载地址如下:
在上面连接中,有三个版本的axis2可以供下载,分别是:
Standard Binary Distribution,Source Distribution,WAR (Web Archive) Distribution,其中标准版可以直接独立使用(Stand-alone),源代码版本需要使用maven进行构建,同时允许开发人员自己修改源代码,本文使用的是WAR版本,可以直接发布在WEB容器中(本文使用的是Tomcat5.5.17)。在上面的链接中还有一个是DOCS的下载,最好一并下载,docs中包含用户手册,快速上手指南,以及其他相关文档,对了解并熟悉AXIS2很有帮助。
闲话少说,将已经下载的WAR包发布(拷贝+粘贴)到%TOMCAT_HOME%/webapps/目录下,其中%TOMCAT_HOME%以Tomcat安装目录进行替换。启动Tomcat,在IE地址栏中键入:
http://localhost:8080/axis2,如果部署成功,即可看到欢迎页面,一般情况下不会出现什么错误。
进入主页之后,可以通过进入Administration链接来管理WEB服务,其中初始化用户名和密码分别为admin/axis2。一般情况下,在管理控制台下进行操作比较方便,但是本文将直接进行操作系统目录级的操作(不会使用UploadServices进行发布服务,而是直接将*.aar拷贝到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services目录下)。
下面我们建立自定义的WEB服务:
我们要将类似以下XML格式的SOAP请求转换为SOAP响应,并获取SOAP请求中的关键元素,进行业务操作,本例子中只是简单的将数值拷贝,没有进行实际的业务操作,但是在代码中进行了指示:
SOAP请求:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope>
<soap:Header />
<soap:Body>
<RevokeCertRequest>
<Issuer>
ABC</Issuer>
<Serial>
DEF</Serial>
<RevocationDate>
GHI</RevocationDate>
</RevokeCertRequest>
</soap:Body>
</soap:Envelope>
SOAP响应:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope>
<soap:Header />
<soap:Body>
<RevokeCertResponse>
<RevokeDate>
GHI</RevokeDate>
</RevokeCertResponse>
</soap:Body>
</soap:Envelope>
在实际应用中,我们可能要获取ABC,DEF,GHI来进行业务处理,最后返回一个其他的消息,但是在示例中,我们仅仅获取ABC,DEF,GHI,然后打印出来,并返回GHI。
Step1.建立工程并创建文件
建立如下图所示的JAVA工程(工程的源代码路径与编译后路径不同,源代码为project/src,编译后为project/bin):首先建立一些类,然后创建serives.xml,最后建立build.xml文件(ANT的构建文件,为了方便测试与构建,所以使用了ANT)
下面是这些文件的内容:
RevokeService.java(这个是进行WEB服务的类):
package newsdes.support.service;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
public class RevokeService {
/**
* The request soap message object.
*/
public static OMElement requestSoap = null;
/**
*
Write the soap response message to xml file.
*
* @param res
* The resource of that forms the xml file.
* @param filePath
* The path where the xml file be stored.
*/
private static void writeResponse(String res, String filePath) {
try {
FileOutputStream fos = new FileOutputStream(filePath);
byte[] bytes = res.getBytes();
fos.write(bytes);