<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jason ---分享,共同進步

    激情成就夢想,努力創(chuàng)造未來
    隨筆 - 53, 文章 - 1, 評論 - 45, 引用 - 0
    數(shù)據(jù)加載中……

    AXIS WebService

    這段時間重構(gòu)一下原來的代碼,把東西整理一下。這個為AXIS的整理

    webService 是一種基于http協(xié)議的組件
    webService 開發(fā)框架:AXIS(Apache eXtensible Interaction System),xFire,
    WSDD就是WEB服務(wù)分布描述(Web Service Deployment Descriptor), 它定義了WEB服務(wù)的接口,如服務(wù)名、提供的方法、方法的參數(shù)等信息。


    AXIS 發(fā)布的兩種方式
    一,即時發(fā)布 jws java web service  只要把.java 文件改成.jws文件,發(fā)布就可以了,但是不支持帶包類


    二,定制發(fā)布 wsdd web service Deployment Descriptor 這個發(fā)布需要配置文件server-config.wsdd文件

    針對AXIS集成到Spring 的項目中。

    一個簡單的AXIS應(yīng)用
     1, 需要的jar 包
     activation.jar
     axis.jar

     axis-ant.jar
     commons-discovery.jar
     commons-logging.jar
     jaxrpc.jar
     log4j-1.2.15.jar
     mail.jar
     wsdl4j.jar
     spring.jar

    .......

    這里其他包就省略了

    我用的框架是struts2+spring +.....

     2, web.xml配置

    <!-- axis webservice配置 start--> 
    <servlet> <servlet-name>AdminServlet</servlet-name> 
    <!-- <display-name>Axis Admin Servlet</display-name> --> 
    <servlet-class> org.apache.axis.transport.http.AdminServlet </servlet-class> 
    </servlet> 
    <servlet> 
    <servlet-name>AxisServlet</servlet-name> 
    <!-- <display-name>Apache-Axis Servlet</display-name> --> 
    <servlet-class> org.apache.axis.transport.http.AxisServlet </servlet-class> 
    </servlet> 
    <servlet> 
    <servlet-name>SOAPMonitorService</servlet-name> 
    <!-- <display-name>SOAP Monitor Service</display-name> --> 
    <servlet-class> org.apache.axis.monitor.SOAPMonitorService </servlet-class> 
    <init-param> 
    <param-name>SOAPMonitorPort</param-name> <param-value>5001</param-value> 
    </init-param> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>AxisServlet</servlet-name> 
    <url-pattern>*.jws</url-pattern> 
    </servlet-mapping> <servlet-mapping> 
    <servlet-name>SOAPMonitorService</servlet-name> 
    <url-pattern>/SOAPMonitor</url-pattern> </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>AxisServlet</servlet-name> 
    <url-pattern>/services/*</url-pattern> </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>AdminServlet</servlet-name> 
    <url-pattern>/servlet/AdminServlet</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>AxisServlet</servlet-name> 
    <url-pattern>/servlet/AxisServlet
    </url-pattern> 
    </servlet-mapping> 
    <!-- axis webservice配置 end--> 

     

     

     3,定制webservice 服務(wù)端接口

     (1) 接口類

    package com.ot.test.service; import java.util.HashMap; import java.util.List; /** * 統(tǒng)一對外服務(wù)接口 * */ public interface ITest { public String test() throws Exception; }

    (2)接口實現(xiàn)類

    package com.ot.test.service; import java.util.HashMap; import java.util.List; /** * 統(tǒng)一對外服務(wù)接口 * */ public class TestImpl implements ITest { //todo private ITestDAO testDao; public String test() throws Exception { //todo 調(diào)用DAO testDao.test(); } }

     這里針對DAO 就不在描述了,這個服務(wù)只是一個業(yè)務(wù)接口。

    (3)定義一個針對Webservice 服務(wù)的接口實現(xiàn)

    在 Spring 中對 Web Service 進行封裝很簡單,僅僅需要繼承

    org.springframework.remoting.jaxrpc.ServletEndpointSupport 類,實現(xiàn)里面的一些方法,包裝一次,將其發(fā)布出來就可以。

    package com.ot.test.service; import java.util.HashMap; import java.util.List; /** * 統(tǒng)一對外服務(wù)接口 * */ public class TestImplAdaptor extends ServletEndpointSupport implements ITest { //todo private ITest test; public String test() throws Exception { //todo 調(diào)用test test.test(); } }

    以上已經(jīng)定義好了服務(wù)端接口,下面需要對AXIS WEBSERVICE進行部署 

    (4)下面的部署我采用了ant 來部署的 ,其中一個重要的包axis-ant.jar現(xiàn)在需要了。

    <?xml version="1.0" encoding="UTF-8" ?> <project name="testclient" default="tojar" basedir="../wsdl"> <property name="wsdl" value="test.wsdl" /> <path id="classpath"> <fileset dir="../WEB-INF/lib" includes="*.jar,*.zip" /> <fileset dir="D:"tomcat6.0"lib" includes="*.jar,*.zip" /> </path> <target name="copy" > <copy todir="${basedir}/test/src"> <fileset dir="../../src"> <include name="**"*.java" /> </fileset> </copy> </target> <!-- **********************************編譯********************************** --> <target name="compile" description="Compile Java sources" depends="copy"> <javac srcdir="${basedir}/test/src" destdir="${basedir}/test/classes" optimize="yes" encoding="utf-8"> <classpath refid="classpath" /> <compilerarg value="-Xlint:none" /> </javac> </target> <target name="axis" depends="compile"> <taskdef resource="axis-tasks.properties" classpathref="classpath" /> <axis-java2wsdl classname="com.ot.service.ITest" location="http://localhost:8080/services/testService" namespace="http://service.ot.com" output="${wsdl}" style="RPC"> <classpath> <pathelement path="${basedir}/opf/classes" /> </classpath> </axis-java2wsdl> <axis-wsdl2java all="true" url="${wsdl}" deployscope="Request" output="${basedir}/client" serverside="true" skeletondeploy="false" testcase="true" noimports="false" typemappingversion="1.3"> </axis-wsdl2java> <delete file="${basedir}/client/service/ITestServiceLocator.java" /> <delete file="${basedir}/client/service/undeploy.wsdd" /> <delete file="${basedir}/client/service/deploy.wsdd" /> </target> <target name="tojar" depends="axis"> <javac destdir="${basedir}/classes" debug="on" optimize="on" classpathref="classpath"> <src path="${basedir}/client" /> </javac> <jar jarfile="../clientdate/testclient.jar"> <fileset dir="${basedir}/classes"> <include name="**/*.class" /> <exclude name="**/*Locator.class" /> </fileset> </jar> <delete dir="${basedir}/opf" /> </target> </project>

     針對上面的ant build.xml文件要說明一下啊,整個過程就是把webservice中需要用到的實體對象,復制出來編譯一下,提供給客戶端使用webservice的用戶。再webservice中復雜的對象,不是java基本類型的,wsdl無法直接轉(zhuǎn)換,需要序列化。

    這就是為什么要生成這個客戶端,其中下面部分要重點說明一下,這也是這個部署的核心。通過axis-java2wsdl 是將webservice 接口生成相應(yīng)的描述文件和客戶端調(diào)用代碼。執(zhí)行后會多生成幾個類,

     ITest.java,ITestService.java,ITestServiceLocator.java,ITestSoapBindingStub.java ,以及undeploy.wsdd 和deploy.wsdd 以及test.wsdl 三個配置文件 但是我會把ITestServiceLocator.java 會刪除了,原因是我在服務(wù)端自己定義了一個這樣的類,目的是我可以自己修改服務(wù)單的地址,這樣對于開發(fā)而言服務(wù)端地址改變不需要重新生成客戶端代碼。 undeploy.wsdd 和deploy.wsdd 兩個文件是部署和取消部署的文件,這里我也不他們刪除,我要手動定義這個文件

    <target name="axis" depends="compile">
    <taskdef resource="axis-tasks.properties" classpathref="classpath" />
    <axis-java2wsdl classname="com.ot.service.ITest" location="http://localhost:8080/services/testService" namespace="http://service.ot.com" output="${wsdl}" style="RPC">
    <classpath>
    <pathelement path="${basedir}/opf/classes" />
    </classpath>
    </axis-java2wsdl>
    <axis-wsdl2java all="true" url="${wsdl}" deployscope="Request" output="${basedir}/client" serverside="true" skeletondeploy="false" testcase="true" noimports="false" typemappingversion="1.3">
    </axis-wsdl2java>


        <delete file="${basedir}/client/service/ITestServiceLocator.java" />
        <delete file="${basedir}/client/service/undeploy.wsdd" />
       <delete file="${basedir}/client/service/deploy.wsdd" />

    </target>


    (5)服務(wù)器部署配置文件server-config.wsdd
    <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration> <parameter name="adminPassword" value="admin" /> <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" /> <parameter name="disablePrettyXML" value="true" /> <parameter name="sendXsiTypes" value="true" /> <parameter name="sendMultiRefs" value="true" /> <parameter name="sendXMLDeclaration" value="true" /> <parameter name="axis.sendMinimizedElements" value="true" /> <parameter name="dotNetSoapEncFix" value="true" /> <parameter name="enableNamespacePrefixOptimization" value="false" /> <requestFlow> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="session" /> </handler> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="request" /> <parameter name="extension" value=".jwr" /> </handler> </requestFlow> </globalConfiguration> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" /> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" /> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" /> <service name="AdminService" provider="java:MSG"> <parameter name="allowedMethods" value="AdminService" /> <parameter name="enableRemoteAdmin" value="false" /> <parameter name="className" value="org.apache.axis.utils.Admin" /> <namespace>http://xml.apache.org/axis/wsdd/</namespace> </service> <service name="Version" provider="java:RPC"> <parameter name="allowedMethods" value="getVersion" /> <parameter name="className" value="org.apache.axis.Version" /> </service> <service name="test" provider="java:RPC" style="rpc" use="encoded"> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="Request" /> <parameter name="className" value="com.ot.service.impl.TestImplAdaptor " /> <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns1:Object" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:java.lang.Object" xmlns:ns1="http://lang.java" /> <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns2:List" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:java.util.ArrayList" xmlns:ns2="http://util.java" /> <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns3:TestVO" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.ot.model.TestVO" xmlns:ns3="http://model.ot.com" /> </service> <transport name="http"> <requestFlow> <handler type="URLMapper" /> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" /> </requestFlow> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder" /> </responseFlow> </transport> </deployment>

    指定好部署文件服務(wù)端已經(jīng)全部構(gòu)建好了,下面我們來構(gòu)建客戶端

     (6)客戶端有兩種方式

    (6-1) 客戶端直接調(diào)用Webservice,就不需要剛才生成的***Locator.java 和 ***SoapBindingStub.java....等

     import java.net.MalformedURLException;
     import javax.xml.rpc.ServiceException;
     import javax.xml.namespace.QName;
     import org.apache.axis.client.Call;
     import org.apache.axis.client.Service;

     public class WSTestServiceClient{
      public static void main(String []args){
       Service service = new Service();
       try {
        Call call = (Call) service.createCall();
        String url = http://localhost:8080/services/testService?wsdl;
        QName qname = new QName(url,"test");
        call.setOperationName(qname);
        call.setTargetEndpointAddress(new java.net.URL(url));
        String result = (String) call.invoke(new Object[]{});
        System.out.println("===="+result);
       } catch (Exception e) {
        e.printStackTrace();
       }
      }
     }

     (6-2) 就是通過剛才客戶端定義的***Locator.java 和 ***SoapBindingStub.java....等方法來調(diào)用

     客戶端同樣也增加了一個使用WEB SERVICE的接口,這樣的目的是代碼結(jié)構(gòu)更完整。具體接口不再說明。。

    主要是相應(yīng)的spring 配置。看如何調(diào)用相應(yīng)的web service

    <!-- 調(diào)用服務(wù)配置 --> <bean id="testAdaptor" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="targetSource" ref="axistestPoolTargetSource" /> <!--<property name="interceptorNames"> <list> <value>methodCachePointCut</value> <value>methodCachePointCutAdvice</value> </list> </property> --> </bean> <bean id="axistestPoolTargetSource" class="org.springframework.aop.target.CommonsPoolTargetSource"> <property name="targetBeanName" value="axistestServiceImpl" /> <property name="maxSize" value="30" /> </bean> <bean id="axistestServiceImpl" class="com.ot.client.impl.TestServcieAdaptor" singleton="false"> <property name="testService"> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" > <property name="singleton"><value>false</value></property> <property name="targetObject"> <bean class="com.ot.client.ITestServiceLocator"></bean> </property> <property name="targetMethod"><value>getTestService</value></property> </bean> </property> </bean>

    posted on 2010-12-04 11:02 agun 閱讀(377) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 日韩视频在线精品视频免费观看| 亚洲av无码无线在线观看| 免费大片av手机看片高清| 国产裸模视频免费区无码| 亚洲变态另类一区二区三区| 日本一道本高清免费| 亚洲AV成人片无码网站| 亚洲天堂中文字幕| 久久久免费精品re6| 亚洲最大视频网站| 免费av欧美国产在钱| 亚洲精品国产首次亮相| 国产免费69成人精品视频| 日韩免费在线中文字幕| 国产亚洲精品AA片在线观看不加载| 美女网站在线观看视频免费的| 亚洲日韩v无码中文字幕| 中文字幕无码免费久久| 亚洲一区二区在线视频| 91在线品视觉盛宴免费| 四虎亚洲精品高清在线观看| 99精品全国免费观看视频| 亚洲AV无码专区在线观看成人| 亚洲AV永久无码精品一区二区国产| 国产日韩在线视频免费播放| 久久亚洲精精品中文字幕| 国产又黄又爽又猛免费app| 国产成人综合久久精品亚洲| 最新国产AV无码专区亚洲| 18女人毛片水真多免费| 亚洲AV性色在线观看| 亚洲AV永久无码精品成人| 又黄又爽又成人免费视频| 国产精品亚洲一区二区三区| 亚洲一区二区三区影院| 久九九精品免费视频| 丰满妇女做a级毛片免费观看| 亚洲av无码乱码国产精品 | 亚洲一线产区二线产区区| 亚洲AV无码之日韩精品| 91香焦国产线观看看免费|