当前位置: 代码迷 >> Web前端 >> Web Service 初探-axis创设实例程序
  详细解决方案

Web Service 初探-axis创设实例程序

热度:609   发布时间:2012-09-05 15:19:35.0
Web Service 初探----axis创建实例程序
总结:利用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、通过客户端程序验证服务是否正确
  相关解决方案