用axis發佈webservices(一)

 首先到apache的網站下載axis的開發包,好久沒看了,現在已經開始出2.0的啦,不過好像還不是很成熟,這裏,我們還是用1.x的包。最新的是1.3的包(如果是用jbuilder的話是不需要再下載的,可以用其自帶的工具發佈的,做起來很簡單,不過下面是以比較通用的方式來介紹)。

一、服務器端開發

      首先編寫服務端程序,這時我們完全不用考慮他是不是當作webservcies來發布的,因爲在寫法上沒有什麼不同。比如我們寫了一個很簡單的java程序,代碼如下:

package samples.userguide.example2;
public class Calculator {
  public int add(int i1, int i2)
  {
    return i1 + i2;
  }
  public int subtract(int i1, int i2)
  {
    return i1 - i2;
  }
}

如果我們要把他發佈成爲services,首先需要把axis-1_3下的lib文件複製到我們的web服務的web-inf 的lib下。 然後在web.xml裏增加以下內容

  <servlet>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-name>AxisServlet</servlet-name>
    <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

第一個是制定AxisServlet的類是必須的,餘下的是配置servlet mapping的,可根據需要進行修改,比如不需要對 *.jws做mapping的時候就可以去掉相應的部分。完成了上邊的必須配置我們就有兩種方式來發布了:

1、動態發佈,直接把Calculator 的java文件複製到webroot下,把Calculator.java更名爲Calculator.jws,然後通過http://localhost:8080/Calculator.jws 訪問就可以 ,通過 http://localhost:8080/Calculator.jws?wsdl 就可以看到相應的wsdl。這種方式調試起來比較麻煩,而且我再測試的時候也不能帶package的信息,而且一些高級的配置無法實施,不建議採用。

2、靜態發佈,就是通過配置文件發佈,這時候我們類的編譯和普通的web方式沒有不同,只是在web-inf下多了一個配置文件,默認的名稱爲server-config.wsdd

<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
    xmlns:handler="http://xml.apache.org/axis/wsdd/providers/handler" xmlns="http://xml.apache.org/axis/wsdd/">
    <globalConfiguration name="defaultClientConfig">
        <requestFlow name="RequestFlow1" type="">
            <handler name="Handler1" type="java:org.apache.axis.handlers.JWSHandler">
                <parameter name="scope" value="session"/>
            </handler>
            <handler name="Handler2" 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"/>
    <transport name="http" type="">
        <requestFlow name="RequestFlow1" type="">
            <handler name="Handler1" type="URLMapper"/>
            <handler name="Handler2" type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
        </requestFlow>
    </transport>
    <transport name="local" type="">
        <responseFlow name="ResponseFlow1" type="">
            <handler name="Handler1" type="LocalResponder"/>
        </responseFlow>
    </transport>
    <service name="AdminService" type="" 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" type="" provider="java:RPC">
        <parameter name="allowedMethods" value="getVersion"/>
        <parameter name="className" value="org.apache.axis.Version"/>
    </service>
    <service name="Calculator" type="" provider="java:RPC" style="rpc" use="encoded">
        <parameter name="scope" value="Request"/>
        <parameter name="className" value="samples.userguide.example2.Calculator"/>
        <parameter name="allowedMethods" value="*"/>
        <namespace>http://example2.userguide.samples</namespace>
    </service>
    <service name="OrderProcessor" provider="java:RPC">
        <parameter name="className" value="samples.userguide.example5.BeanService"/>
        <parameter name="allowedMethods" value="*"/>
        <beanMapping qname="myNS:Order" xmlns:myNS="urn:BeanService" languageSpecificType="java:samples.userguide.example5.Order"/>
    </service>
</deployment>

其中要發佈的每個service都需要加上一個service的節點描述,其他多餘的servie節點可以刪除的,這樣重啓tomcat後,我們就可以以http://localhost:8080/services/Calculator 來訪問這個service了,同樣以http://localhost:8080/services/Calculator?wsdl 訪問到它的wsdl描述文件。

二、客戶端開發

在開發工具中引進lib下的jar包;然後編寫客戶端程序

package samples.userguide.example2;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;

import javax.xml.rpc.ParameterMode;

public class CalcClient
{
   public static void main(String [] args) throws Exception {
       try{
           String endpoint = "https://localhost:8440/services/Calculator";
           Integer i1 = new Integer(1);
           Integer i2 = new Integer(2);

           Service service = new Service();
           Call call = (Call) service.createCall();

           call.setTargetEndpointAddress(new java.net.URL(endpoint));
           call.setOperationName("add");
           call.addParameter("i1", XMLType.XSD_INT, ParameterMode.IN);
           call.addParameter("i2", XMLType.XSD_INT, ParameterMode.IN);
           call.setReturnType(XMLType.XSD_INT);

           Integer ret = (Integer) call.invoke(new Object[] {i1, i2});

           System.out.println("Got result : " + ret);
       }
       catch(Exception e){
           e.printStackTrace();
       }
   }
}

其中 setOperationName就是指定執行的方法,addParameter就是指定參數
運行一下吧

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章