志當存高遠,功到自然成!

          少年強則中國強,少年進步則中國進步!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

          根 據網上搜索到的一些例子做的時候碰到了挺多的問題,經過不懈的努力終于完成了這個webservice的例子,實際上axis的文檔上也寫了一個例子,網 上的例子也大多都是照他上面所寫的那樣,只是有些講的不算很詳細,所以產生了不少錯誤,小弟知識淺薄,如有寫的不清楚地地方,還請見諒

          所需軟件
          tomcat        :http://tomcat.apache.org/index.html
          axis          :http://ws.apache.org/axis/
          jdk           :http://java.sun.com/javase/downloads/index.jsp
          jaf           :http://java.sun.com/products/javabeans/jaf/downloads/index.html
          xmlrpc        :http://ws.apache.org/xmlrpc

          XML解析器
          Xalan         :http://archive.apache.org/dist/xml/xalan-j/
          Xerces        :http://xml.apache.org/dist/xerces-j/

          本例講解axis定制發布

          本實例采用
          j2sdk1.4.2_05,tomcat5.0.28,axis1.4,jbuilder X / Eclipse3.2

          首先將axis解壓至相應目錄,如d:\下,安裝tomcat至c:\tomcat5,安裝jdk至c:\ j2sdk1.4.2_05
          然后將d:\axis\webapp目錄下的axis目錄copy至c:\tomcat5\webapps目錄下

          設置axis的環境變量

          AXIS_HOME=d:\axis

          AXIS_LIB=%AXIS_HOME%\lib

          AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\activation.jar;%AXIS_LIB%\xmlrpc-2.0.jar

           

          (xml-apis.jar, xercesImpl.jar屬于Xerces或Xalan, activation.jar屬于jaf, xmlrpc-2.0.jar屬于xmlrpc)

          1. 配置完成后啟動tomcat,在瀏覽器中鍵入http://localhost:8080/axis,將顯示如下畫面

          查看更多精彩圖片

          2.在C:\Tomcat5\webapps\axis\WEB-INF目錄下建立一個src目錄,用于存放源程序
          接著編寫服務端程序server.AxisReturn
          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName) {
                return "Axis Return: "+ servicesName;
              }
          }
          在 此我們利用了Jbuilder X作為我們java程序的開發工具,利用Jbuilder新建工程中的Project for Existing Code將C:\Tomcat5\webapps\axis\WEB-INF下的程序及目錄導入作為Jbuilder的一個工程來操作

          查看更多精彩圖片
          編譯AxisReturn程序,Jbuilder將會把編譯后的class文件自存放在C:\Tomcat5\webapps\axis\WEB-INF\classes\server目錄下

          3.編寫wsdd文件,此處命名為deploy.wsdd,其內容為

          <deployment xmlns=http://xml.apache.org/axis/wsdd/
                        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
          <service name="AxisReturn" provider="java:RPC">
              <parameter name="className" value="server.AxisReturn"/>
              <parameter name="allowedMethods" value="*"/>
          </service>
          </deployment>


          每個service就代表服務端的一個程序,如有多個可繼續添加service,相關參數請查閱axis文檔
          此處的deployment代表發布服務,如改為undeployment則為撤銷服務

          4.發布服務
          打開windows的命令窗口,轉到wsdd文件的存放目錄下,此處為C:\Tomcat5\webapps\axis\WEB-INF\src\server
          在命令窗口中鍵入
          java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd

          如果成功將顯示<Admin>Done processing</Admin>
          如失敗,則檢查AXISCLASSPATH是否設置正確,tomcat端口是否為默認的8080
          在這里有一個問題需注意,不管是在axis目錄下還是其他虛擬目錄下,如直接執行這條命令,都將在axis的目錄下發布service,如果想發布在其他的目錄下,如pscsaxis,則應執行
          java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/pscsaxis/services/AdminService deploy.wsdd

          -cp表示在AXISCLASSPATH環境變量中檢索org.apache.axis.client.AdminClient方法

          5.生成client stub文件
          在命令窗口中將目錄轉至C:\Tomcat5\webapps\axis\WEB-INF\classes
          然后執行
          java -cp %AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -oAxisReturn.wsdl -lhttp://localhost:8080/axis/services/AxisReturn -nAxisReturn server.AxisReturn

          將會在C:\Tomcat5\webapps\pscsaxis\WEB-INF\classes下生成AxisReturn.wsdl文件
          接著在執行
          java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java AxisReturn.wsdl -p client

          將會在C:\Tomcat5\webapps\axis\WEB-INF\classes\client目錄下生成四個java文件
          AxisReturn_PortType.java
          AxisReturnService.java
          AxisReturnServiceLocator.java
          AxisReturnSoapBindingStub.java
          將這四個文件剪切至C:\Tomcat5\webapps\pscsaxis\WEB-INF\src\client目錄下,并編譯

          6.編寫客戶端
          利用生成client stub文件編寫

          package client;
          public class ClientAxisReturn {
              public static void main(String args[]) {
                try {
                  AxisReturnService service = new client.AxisReturnServiceLocator();
                  client.AxisReturn_PortType client = service.getAxisReturn();
                  String retValue = client.returnMsg("BaoSteel");
                  System.out.println(retValue);
                }
                catch (Exception e) {
                  System.err.println("Execution failed. Exception: " + e);
                }
              }
          }

          編寫完后,編譯運行即可得到返回結果
          如需傳入多個參數,需在String retValue = client.returnMsg("BaoSteel");這句中增加參數,如
          String retValue = client.returnMsg("BaoSteel","PSCS_IMS");
          相應的服務端也要更改,如
          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName,String serviceID) {
                return "Axis Return: "+ servicesName+ serviceID;
              }
          }

          利用發布服務的wsdl的URL編寫
          package client;
          import org.apache.axis.AxisFault;
          import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;
          import javax.xml.rpc.ParameterMode;
          import javax.xml.rpc.encoding.XMLType;
          public class ClientAxisReturnWsdl {
              public static void main(String args[]) throws Exception{
                String endPoint =
                  
          http://190.2.63.239:8080/pscsaxis/services/AxisReturn?wsdl;
                Service service = new Service();
                Call call = (Call) service.createCall();
                Object result;
                try {
                  call.setTargetEndpointAddress(new java.net.URL(endPoint));
                  call.setOperationName("ReturnMsg");
                  call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
                  call.setReturnType(XMLType.XSD_STRING);
                  result = (Object) call.invoke(new Object[] {"BaoSteel"});
                }
                catch (AxisFault fault) {
                  result = "Error is: " + fault.toString();
                }
                System.out.println(result);
              }
          }

          編寫完后,編譯運行即可得到返回結果
          如許增加參數,則需添加語句
          call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
          將參數名OP1改為其他,如OP2
          在result = (Object) call.invoke(new Object[] {" BaoSteel "});這句中增加參數,如
          result = (Object) call.invoke(new Object[] {" BaoSteel "," PSCS_IMS "});
          相應的服務端也要更改,如
          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName,String serviceID) {
                return "Axis Return: "+ servicesName+ serviceID;
              }
          }

          ★在這里,我們的服務端只有一個方法供我們調用,如果我們需要調用多個服務端的方法,則可在服務端中加入其他方法,如我們在增加一個xxMsg

          package server;
          public class AxisReturn {
              public String ReturnMsg(String servicesName,String systemID) {
                return "Axis Return: "+ str+servicesName+systemID;
              }
              public String xxMsg(String serviceName,String systemID) {
              return "XX Return: "+ str+serviceName+systemID;
          }
          }

          ★修改完后將其編譯,并將其注銷后重新發布,反之需要重起tomcat,否則服務將不被更新
          ★利用生成client stub文件編寫的客戶端程序,還需重新生成client stub文件,并將其編譯,在客戶端程序中調用其相應得方法即可

          SOAPMonitor的配置

          發 布了Web服務以后,如何觀察請求和響應數據呢?記錄運行日志是一種傳統且有效的方法,但對于調試程序來講還不夠方便和直觀。值得欣慰的是,Axis為我 們提供了在客戶端觀察SOAP請求和響應流數據的工具SoapMonitor,經過適當配置后,可以實時地觀察到Web服務的SOAP請求和響應數據。 SoapMonitor是一個Java Applet程序,通過瀏覽器下載到客戶端運行。下面就介紹SoapMonitor的配置和使用方法。

          在C:\Tomcat5\webapps\axis的目錄下有一個SOAPMonitorApplet.java的程序,axis默認沒有給我們編譯,我們需要自己進行編譯

          打開windows命令窗口,轉到C:\Tomcat5\webapps\axis目錄下,執行
          javac -classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java

          編譯完成后需要發布服務,我們需要建立一個wsdd文件deploy-monitor.wsdd,內容如下

          <deployment xmlns=http://xml.apache.org/axis/wsdd/
                xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
              <handler name="soapmonitor"
                  type="java:org.apache.axis.handlers.SOAPMonitorHandler">
                <parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
                <parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
                <parameter name="serviceName" value="SOAPMonitorService"/>
                <parameter name="portName" value="Demo"/>
              </handler>
              <service name="SOAPMonitorService" provider="java:RPC">
                <parameter name="allowedMethods" value="publishMessage"/>
                <parameter name="className" value="org.apache.axis.monitor.SOAPMonitorService"/>
                <parameter name="scope" value="Application"/>
              </service>
          </deployment>

          需要注意的是紅色的那句語句,如果是在我們自己的web應用目錄下的話需改成自己的目錄。
          建立完成后執行命令進行發布
          java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy-monitor.wsdd

          發布SOAPMonitor服務后,還要對被監測的Web服務進行配置。方法是先注銷該Web服務,然后修改該服務對應的WSDD文件,在其中增加請求流和響應流的配置,否則是觀測不到SOAP請求和響應流的。以我們上面的程序為例,將deploy.wsdd修改為

           

          <deployment xmlns=http://xml.apache.org/axis/wsdd/
                        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
          <service name="AxisReturn" provider="java:RPC">
                <requestFlow>
                  <handler type="soapmonitor"/>
                </requestFlow>
                <responseFlow>
                  <handler type="soapmonitor"/>
                </responseFlow>
              <parameter name="className" value="server.AxisReturn"/>
              <parameter name="allowedMethods" value="*"/>
          </service>
          </deployment>


          增加了
               <requestFlow>
                  <handler type="soapmonitor"/>
                </requestFlow>
                <responseFlow>
                  <handler type="soapmonitor"/>
                </responseFlow>
          這兩段

          然后我們通過點擊http://localhost:8080/axis/主頁上的SOAPMonitor或直接訪問http://localhost:8080/axis/SOAPMonitor,點擊start或stop啟動或停止監控,然后我們運行客戶端程序,SOAPMonitor會監控到請求和響應流,如下圖

          查看更多精彩圖片

          在 這里,我們需要注意一個配置問題,如果tomcat下有多個axis應用,設置了多個SOAPmonitor,我們則需要更改SOAPmonitor的端 口(axis默認配置的是5001),否則會產生沖突,運行SOAPmonitor時會無法啟動,提示the soap monitor is unable to communcate with the server,解決方法如下:

          打開C:\Tomcat5\webapps\axis\WEB-INF目錄下的web.xml,找到

          <servlet>
                <servlet-name>SOAPMonitorService</servlet-name>
                <display-name>SOAPMonitorService</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>
                <load-on-startup>100</load-on-startup>
          </servlet>

          這段,將其中的5001改成5002,依此類推

          總結:
          盡量將發布websrrvice的文件夾和axis分開放置
          建立多個axis應用時,應注意一些端口的設置,命令的參數設置以及一些命令執行的路徑設置等,否則會產生一些錯誤,如ClassNotFound,service發布錯誤等的錯誤

           

          server-config.wsdd

          <?xml version="1.0" encoding="UTF-8"?>
          <deployment xmlns:java="      xmlns:handler="      xmlns="      xmlns:xsi="      name="defaultClientConfig" xsi:type="deployment">
               <globalConfiguration>
                   <parameter name="disablePrettyXML" 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="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
               <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
               <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

              <service name="CallcenterWebServices" provider="java:RPC" style="rpc" use="encoded">
                   <parameter name="scope" value="Request"/>
                   <parameter name="className" value="com.isw2.ebay.callcenter.axis.CallcenterWebServices"/>
                   <parameter name="allowedMethods" value="getStatus,getCsrBean,setStatus,createCase,showContactRecord,getWorkload"/>
                   
              <beanMapping qname="myNS:CsrBean" xmlns:myNS="urn:CsrBean"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.CsrBean" />
             <beanMapping qname="myNS:ContactRecordBean" xmlns:myNS="urn:ContactRecordBean"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.ContactRecordBean" />  
             <beanMapping qname="myNS:DisputeContactRecord" xmlns:myNS="urn:DisputeContactRecord"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.DisputeContactRecord" />
             <beanMapping qname="myNS:WorkloadNumberBean" xmlns:myNS="urn:WorkloadNumberBean"
              languageSpecificType="java:com.isw2.ebay.callcenter.axis.WorkloadNumberBean" />  
            
               </service>
              
               <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>
               <transport name="http">
                   <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
                   <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
                   <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
                   <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>

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


          網站導航:
           
          主站蜘蛛池模板: 珠海市| 锡林浩特市| 隆昌县| 绥滨县| 津南区| 龙州县| 介休市| 密云县| 西宁市| 兰考县| 独山县| 庆安县| 新建县| 清水县| 宁远县| 宜宾县| 梁平县| 潞西市| 于田县| 屯门区| 交口县| 延寿县| 五大连池市| 临沂市| 治县。| 林州市| 河源市| 苍山县| 灯塔市| 遂宁市| 常山县| 静宁县| 天门市| 南平市| 延安市| 宝山区| 沂源县| 铜川市| 乡宁县| 安远县| 湖北省|