首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Axis2创设webservice服务的方式 之 ADB 方式(二)

2013-07-26 
Axis2创建webservice服务的方式 之 ADB 方式(二)package test.adb.service/***TestAdbSkeleton java skel

Axis2创建webservice服务的方式 之 ADB 方式(二)
package test.adb.service;/*** TestAdbSkeleton java skeleton for the axisService*/public class TestAdbSkeleton implements TestAdbSkeletonInterface{ public test.adb.theinterface.GetNameResponse getName(test.adb.theinterface.GetName getName0) { // TODO : fill this with the necessary business logic throw new java.lang.UnsupportedOperationException("Please implement " + this.getClass().getName() + "#getName"); } public void setName(test.adb.theinterface.SetName setName2) { // TODO : fill this with the necessary business logic }}

?
这个java类,跟之前的接口ITestAdb很类似,
只是 函数的返回值和参数变成了类似getName ,setName这种奇怪的类型.
这些类(getName ,setName)型是在wsdl中定义的type:

?

<wsdl:types>    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://theinterface.adb.test">            <xs:element name="setName">                <xs:complexType>                    <xs:sequence>                        <xs:element minOccurs="0" name="args0" nillable="true" type="xs:string"/>                    </xs:sequence>                </xs:complexType>            </xs:element>            <xs:element name="getName">                <xs:complexType>                    <xs:sequence/>                </xs:complexType>            </xs:element>            <xs:element name="getNameResponse">                <xs:complexType>                    <xs:sequence>                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>                    </xs:sequence>                </xs:complexType>            </xs:element>        </xs:schema>  </wsdl:types>

?
因为webservice基于soap接口,在做数据交换时,使用xml传递数据.这样在调用webservice服务时,

? 函数的返回值和方法参数都要变成一种特殊的格式,即,使用xml表示.

? 比如,原来接口中 setName(Sring Name)方法 的参数 被定义成一种xml元素(setName)了,

? 参数被定义为子元素 了,但是参数名称变成了arg0了,而不是原来的name(因为是自动生成的wsdl文件).

? 当函数有返回值时,还会定义一种返回值类型,比如getNameResponse.

? 在生成代码的时候,wsdl2java工具,将这些定义的类型都生成对应的Java类,比如getName,setName类型.

? 定义好这种类型后,假如客户端请求服务,比如请求setName服务,那么客户端需要传递xml格式的参数,name,

? 然后,服务器端收到xml的参数信息,并将xml信息转换成对应的setName类型的类对象,然后将这个对象传递给

? TestAdbSkeleton类的setName方法,做了相关处理后,完成客户端请求.

? 当客户端请求的操作有返回值,比如getName,服务器端完成请求后,会返回结果,就是getNameResponse类型,

? 客户端收到这个getNameResponse,在根据这个getNameResponse类型在wsdl中的定义,转换成xml格式,

? 然后获取处理结果数据.


以算 setName这个类来分析:
SetName.java代码如下(部分):

public class SetName implements org.apache.axis2.databinding.ADBBean{  public static final javax.xml.namespace.QName MY_QNAME            = new javax.xml.namespace.QName("http://theinterface.adb.test", "setName", "ns1");  /**  * field for Args0  */  protected java.lang.String                    localArgs0;  /*   * This tracker boolean wil be used to detect whether the user called the set method for this attribute. It will be   * used to determine whether to include this field in the serialized XML   */  protected boolean                             localArgs0Tracker = false;  public boolean isArgs0Specified()  {    return localArgs0Tracker;  }  /**  * Auto generated getter method  * @return java.lang.String  */  public java.lang.String getArgs0()  {    return localArgs0;  }  /**     * Auto generated setter method     * @param param Args0     */  public void setArgs0(java.lang.String param)  {    localArgs0Tracker = true;    this.localArgs0 = param;  }  /**  *  * @param parentQName  * @param factory  * @return org.apache.axiom.om.OMElement  */  public org.apache.axiom.om.OMElement getOMElement(final javax.xml.namespace.QName parentQName,      final org.apache.axiom.om.OMFactory factory) throws org.apache.axis2.databinding.ADBException  {    org.apache.axiom.om.OMDataSource dataSource = new org.apache.axis2.databinding.ADBDataSource(this, MY_QNAME);    return factory.createOMElement(dataSource, MY_QNAME);  }    //以下代码省略....  }

?

由以上代码可知,setName这个类型,实现了下面的接口.

public class SetName implements org.apache.axis2.databinding.ADBBean

这个接口干嘛的呢?

看代码:

?

public interface ADBBean    extends Serializable{    public abstract XMLStreamReader getPullParser(QName qname)        throws XMLStreamException;    public abstract OMElement getOMElement(QName qname, OMFactory omfactory)        throws ADBException;    public abstract void serialize(QName qname, XMLStreamWriter xmlstreamwriter)        throws XMLStreamException, ADBException;    public abstract void serialize(QName qname, XMLStreamWriter xmlstreamwriter, boolean flag)        throws XMLStreamException, ADBException;}

?

有getArgs0()的方法,可以获取传递的参数.

?

还有个方法,public abstract OMElement getOMElement,这个是比较重要的方法.

返回的是OMElement类型,这个其实是表示xml的一个element,

比较特殊的是Axis2采用了一种比较特殊的解析xml的方法或者称之为模型,或者叫新型的xml解析引擎,

就是AXIOM,而OMElement就是AXIOM解析引擎解析出来的xml的element对象类型吧.

?

得到OMElement这个了,能干什么呢?

看看OMElement的api.

参考这个:http://ws.apache.org/axiom/apidocs/org/apache/axiom/om/OMElement.html

这里的api,就跟其他的xml的element一样,有一些getText,getAttribute神马的.

这样,在服务器端,通过OMElement这个就能得到客户端传来的数据了.

?

getName这个方法,需要返回一个getNameResponse,可以新建一个getNameResponsed对象,

然后调用getNameResponse对象的set_return方法,设置返回值.

?

于是,可以实现服务类了:

package test.adb.service;import test.adb.theinterface.GetNameResponse;/** *  TestAdbSkeleton java skeleton for the axisService */public class TestAdbSkeleton implements TestAdbSkeletonInterface{  private String name = "Jack";  public test.adb.theinterface.GetNameResponse getName(test.adb.theinterface.GetName getName0)  {    // TODO : fill this with the necessary business logic    test.adb.theinterface.GetNameResponse gmr = new GetNameResponse();    gmr.set_return(this.name);    return gmr;  }  public void setName(test.adb.theinterface.SetName setName2)  {    // TODO : fill this with the necessary business logic    String arg = setName2.getArgs0();    this.name = arg;  }  }

?

最后,调用ant,编译build.xml会生成TestWebService\build\lib\TestAdb.aar,使用该文件,即可完成webservice的部署.

例如,将上面的.aar文件部署到axis2自带的.war中时,可以通过下面的链接访问

http://localhost:8080/axis2/services/TestAdb/setName?args0=jjj

?

附件是工程(myeclipse 6.5),因为文件大小限制,删除了lib里面Axis1.6.2的jar包,需要补上.

?

遗留问题:

1. 自动生成的 wsdl文件,里面的 方法参数变成 args0这样的,不是原来接口中的方法名,这个能否自动纠正,还是需要手工修改自动生成的wsdl文件?

?

答案:?

package test.adb.theinterface;import javax.jws.WebParam;public interface ITestAdb{ void setName(@WebParam(name = "name") String name); String getName();}

??自动生成的wsdl片段:

<xs:element name="setName">                <xs:complexType>                    <xs:sequence>                        <!-- name属性改过来了变成name了 -->                        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>                    </xs:sequence>                </xs:complexType>            </xs:element>

?

?

参考:?http://bbs.csdn.net/topics/390191801

?

2. wsdl里面service的location问题,是否写死了,部署到别的目录就不能访问了?

比如,上面的配置是

<http:address location="http://localhost:8080/axis2/services/TestAdb"/>

部署服务时,要是放到其他的目录中呢??

?

问题2 参考:?http://yuanlg.iteye.com/blog/1409906

热点排行