总结:利用Axis写一个小例子:
本文参考文章:axis2开发webservice入门,从发布到测试。其连接为:http://gray1880.blog.163.com/blog/static/25968958200891654312681/?latestBlog很不错的文章,微小的瑕疵是:没有讲清楚bin中到底是什么内容,不过我已经找到了,具体如文章所述。
准备阶段:
1、下载必要的包,本例以最新的axis2-1.5.3为例(下载地址:http://axis.apache.org/axis2/java/core/download.cgi),需要下载axis2的二进制压缩包axis2-1.5.3-bin.zip,里面包含了若干例子;下载axis2的war压缩包axis2-1.5.3-war.zip,将其解压后,将axis.war文件,拷贝到tomcat的webapps文件夹下面,如:D:\Java\Tomcat 6.0\webapps\axis2
2、下载ant文件,将其解压,如D:\Java\apache-ant-1.7.1,配置系统环境变量,
ANT_HOME=D:\Java\apache-ant-1.7.1;因为需要ant进行文件的打包,及部署等操作;
第一步:在Myeclipse中创建web service工程,编写服务器端程序
package newsdes.support.service;//看清楚这个包的位置
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
/**
* @author MARS
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class RevokeService {
public static OMElement requestSoap = null;
// 主要的WEB服务方法
public OMElement RevokeCertRequest(OMElement soapBody) {
String issuer = "";
String serial = "";
String revocationDate = "";
requestSoap = soapBody;
//利用soap传过去的是个OMElement 对象,我们只需要对它进行操作。上面是传的三个参数。
Iterator iter = requestSoap.getChildElements();
//把OMElement对象变为Iterator 对象,这样我们的工作就可以开始了。
while (iter.hasNext()//循环取下一个结点的内容只到没有为止) {
OMElement request = (OMElement) iter.next();
//取子结点的内容。传过来的OMElement可以是<XX><YY>11</YY><ZZ>22</ZZ></XX>,这样yy ,zz就叫XX的子结点。
//这个是例子,我做的项目传过来的OMElement中有2个包含,所以如果你也遇到这种情况用2次iter.next()就解决了。所以不管他包了多少层我们都能解析。
if (request.getLocalName().trim().equals("Issuer")) {
issuer = request.getText().trim();
//request.getLocalName()取当前结点的名称,就是那个xx,yy,zz; request.getText是取其中的值。
} else if (request.getLocalName().trim().equals("Serial")) {
serial = request.getText();
} else if (
request.getLocalName().trim().equals("RevocationDate")) {
revocationDate = request.getText();
}
}
System.out.println(issuer);
System.out.println(serial);
System.out.println(revocationDate);
OMFactory soapFactory = OMAbstractFactory.getOMFactory();
//这个用中文我也不好说 就算是创造了一个工厂吧。
OMNamespace omNs =
soapFactory.createOMNamespace("http://www.sdes.net/", "");
//这个是命名空间,实际情况需要看对方给你的wsdl这个值是什么.这是服务器端随便你定义.客户端需要照这个样子传才行。后面那个参数可为空也可以有值。这个东西也好理解调试的时候打印下OMElement 就知道这东西怎么用了。
OMElement soapResponse = soapFactory.createOMElement("RevokeCertResponse", omNs);
//创建OMElement 对象后面那个参数就是命名空间
OMElement soapMain = soapFactory.createOMElement("RevokeDate", omNs);
soapMain.setText(revocationDate);//往结点塞值
soapResponse.addChild(soapMain);//把一个对象放入另一个对象,soapMain就是soapResponse的子结点。
soapResponse.build();
return soapResponse;
}
}
编译出错时,是因为没有把必须的包引入,将压缩包axis2-1.5.3-bin.zip的lib下的所有jar文件导入项目路径即可。
第二步:在项目的根目录下建立文件夹:bin,将压缩包axis2-1.5.3-bin.zip内的bin下的所有内容拷贝过来,并且建立文件夹:META-INF,在其下面创建services.xml,路径如图1所示,到时候服务器遇到请求看到这个文件就知道调用哪个类了。应该是服务器启动就会读这个文件的。
图1
services.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
<service name="CertRevokeService">
<description>This is the service for revoking certificate.</description>
<parameter name="ServiceClass" locked="false">newsdes.support.service.RevokeService</parameter>
<operation name="RevokeCertRequest">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
<actionMapping>urn:RevokeCertRequest</actionMapping>
</operation>
</service>
</serviceGroup>
你可以写多个服务,还有就再加个<service></service>就行,因为我要返回给客户端东西所以要用
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" />
RawXMLINOutMessageReceiver, inout模式,如果不需要返回值就用inonly模式.
启动服务器就是bin目录下的startup.bat,关闭服务器是shutdown.bat.然后进http://localhost:8080/axis2,没有问题的话,显示如图2所示,表示axis2部署成功,下面需要向里面发布新创建的服务
图2
如果能看到就把服务器关了。
我们现在开始打包,ant已经下载了,我们做一个build.xml文件放项目的根目录, 内容为:
<?xml version="1.0" encoding="gb2312"?>
<project name="SDES_Enhance" default="deploy" basedir=".">
<property name="dist" value="${basedir}/dist" />
<property name="data" value="${basedir}/data"/>
<property name="service" value="D:\Java\Tomcat 6.0\webapps\axis2\WEB-INF\services" /><!--注意:此处根据你的系统中axis的安装路径设置-->
<target name="init" >
<echo>初始化目录</echo>
<delete dir="${dist}"/>
<delete dir="${basedir}/data"/>
<mkdir dir="${dist}"/>
<mkdir dir="${basedir}/data"/>
</target>
<target name="archive" depends="init">
<echo>打包</echo>
<jar destfile="${dist}/SDES_Enhance.aar" basedir="${basedir}/bin" />
</target>
<target name="deploy" depends="archive">
<echo>复制文件</echo>
<copy todir="${service}">
<fileset dir="${dist}">
<include name="SDES_Enhance.aar"/>
</fileset>
</copy>
</target>
<target name="clean" >
<echo>删除目录</echo>
<delete dir="${dist}"/>
<delete dir="${data}"/>
</target>
</project>
大概讲一下ant的语法。一个build文件肯定包含一个project(工程),若干个target(任务),project里面有个属性default=""(工程开始时执行的任务) 我们可以看到 本文中default="deploy" ,所以他先执行的是deploy任务,
target有个属性depends(依赖)就是如果要执行这个任务首先要执行什么任务。本文中deploy任务的depends属性等于"archive",所以先执行archive,根据这个语法所以本文先执行的是
<target name="init" >
<echo>初始化目录</echo>
<delete dir="${dist}"/>
<delete dir="${basedir}/data"/>
<mkdir dir="${dist}"/>
<mkdir dir="${basedir}/data"/>
</target>
dir="${basedir}/data/"意思是在工程目录下创建一个data目录。
<target name="deploy" depends="archive">
<echo>复制文件</echo>
<copy todir="${service}">
<fileset dir="${dist}">
<include name="SDES_Enhance.aar"/>
</fileset>
</copy>
</target>
注意:运行这个build.xml文件之前,需要写全bin文件,否则会出现找不到类的错误,将项目中WebRoot下的WEB-INF的classes下编译后的两个文件拷到bin下;如图3所示。bin的最终内容见图1所示。
图3
build.xml中的deploy是把aar文件直接copy到axis2的service中,这样才重新启动tomcat就发布好了。
如果你想在axis2页面手动加载那么就不需要这个任务了,其实质是将生成好的aar文件拷贝到axis2的WEB-INF\services文件夹下,当tomcat加载axis2时,会把打包好的aar文件发布成webservice服务。例如:D:\Java\Tomcat 6.0\webapps\axis2\WEB-INF\services。
手动加载的方法是启动服务器输入地址:http://localhost:8080/axis2,进入页面后点Administration ,name是admin,密码是axis2,进入后点Upload Service ,然后点浏览选择你的aar所在文件在工程目录的dist目录下,然后点upload. 这样就OK了,点services看下你的服务加载成功没有。如果按照步骤来的应该没问题。
第三步:接下来我们写客户端测试。
/*
* 创建日期 2008-10-10
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.neusoft.service.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.databinding.utils.BeanUtil;
/**
* @author MARS
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class TestCertRevokeService {
private static EndpointReference targetEPR =
new EndpointReference("http://localhost:8080/axis2/services/CertRevokeService");
public static OMElement getSoapRequestMessage() {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace omNs = factory.createOMNamespace("http://www.sdes.net/", "");
OMElement issuer = factory.createOMElement("Issuer", omNs);
OMElement serial = factory.createOMElement("Serial", omNs);
OMElement revocationDate =
factory.createOMElement("RevocationDate", omNs);
issuer.setText("C=JP,O=FX,CN=SDES CA");
serial.setText("1234567890");
revocationDate.setText("2007-01-01T00:00:00.000Z");
OMElement requestSoapMessage =
factory.createOMElement("RevokeCertRequest", omNs);
requestSoapMessage.addChild(issuer);
requestSoapMessage.addChild(serial);
requestSoapMessage.addChild(revocationDate);
requestSoapMessage.build();
return requestSoapMessage;
}
public static void main(String[] args) {
OMElement requestSoapMessage = getSoapRequestMessage();
//上面的我就不多讲了,因为服务器端已经解释过,我们看下面的代码.
Options options = new Options();
//生成一个options对象然后把前面的地址放进去。
options.setTo(targetEPR);
ServiceClient sender = null;
try {
sender = new ServiceClient();
// 把刚才生成的options放入serviceclient对象,这样就成功一半了。然后就可以用了
sender.setOptions(options);
System.err.println("requestSoapMessage======" + requestSoapMessage);
//这个就是放服务端发请求了。
sender.sendReceive(requestSoapMessage);
} catch (AxisFault e) {
System.out.println(e.getFaultNodeElement().toString());
}
}
}
把服务启动起来,运行这个类 你就可以在tomact服务器看到你所输入参数的值了。
发布成功后图4如下:注意右下角的webService服务:CertRevokeService
这个例子的所需要的知识基本都在这里讲了,如果觉得需要深入了解可以再查查资料。万事开头难,只有先知道基础东西知道他为什么这样用才能再继续深入研究。
总结一下这个例子:
需要做的操作依次为:
1、下载必须的包,解压缩后放到需要的位置,即部署好axis.war,启动tomcat,点击axis2链接,查看是否部署正确;
2、建立工程,两个普通的客户端程序和服务器端程序。
3、创建services.xml类,查看axis服务是否正常;
4、创建build.xml,打包必须的文件,并部署到axis中,将aar发布到webservice服务
5、通过客户端程序验证服务是否正确