webservice復雜類型實例


 1.准備工作:

概念:SOAP(簡單對象訪問協議)、WSDL(web服務描述語言)、XML(可擴展標記語言)、axis(阿帕奇可擴展交互系統)

(1)     下載axis1.4,將axis1.4中的axis項目中WEB-INF\lib,將lib下的jar文件拷貝到工程如webservice的WEB-INF\lib下

(2)     將axis1.4中的axis項目,拷貝到tomcat的webapps目錄下

(3)   配置Java和Tomcat環境,設置axis環境,類似jdk的配置方法,例如:

AXIS_HOME= E:\apache-tomcat-6.0.37-windows-x86\apache-tomcat-6.0.37\webapps\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     (最后兩個可能沒有,不是必須的)

 

(4)       配置web.xml添加

 <?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web

Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<display-name>Apache-Axis</display-name>

<listener>

<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>

</listener>

<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>AdminServlet</servlet-name>

<display-name>Axis Admin Servlet</display-name>

<servlet-class>

org.apache.axis.transport.http.AdminServlet

    </servlet-class>

<load-on-startup>100</load-on-startup>

</servlet>

<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>

<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>

<servlet-mapping

<servlet-name>SOAPMonitorService</servlet-name>

<url-pattern>/SOAPMonitor</url-pattern>

</servlet-mapping>

<session-config>

<session-timeout>5</session-timeout>

</session-config>

<mime-mapping>

<extension>wsdl</extension>

<mime-type>text/xml</mime-type>

</mime-mapping>

<mime-mapping>

<extension>xsd</extension>

<mime-type>text/xml</mime-type>

</mime-mapping>

<welcome-file-list id="WelcomeFileList">

<welcome-file>index.jsp</welcome-file>

<welcome-file>index.html</welcome-file>

<welcome-file>index.jws</welcome-file>

</welcome-file-list>

</web-app>

 

 

2.實戰

1.業務方法類的入參bean

Request.java

package com.webservice.request;

 

import java.util.ArrayList;

import java.util.List;

 

public class Request {

 

    // 基本類型

    private String msg;

 

    // 基本類型 ,list會在客戶端生成對象數組Object[]

    private List<Integer> list = new ArrayList<Integer>();

 

    // 不要使用數組,因為要指定大小,應該使用list替代

    // private String[] array;

 

    public List<Integer> getList() {

       return list;

    }

 

    public String getMsg() {

       return msg;

    }

 

    public void setList(List<Integer> list) {

       this.list = list;

    }

 

    public void setMsg(String msg) {

       this.msg = msg;

    }

 

 

}

 

 

2. 業務方法類的回參bean

Response.java

package com.webservice.respone;

 

import java.util.ArrayList;

import java.util.List;

 

public class Response {

 

    // 基本類型

    private int code;

 

    private String errorMsg;

 

    // 基本類型 ,list會在客戶端生成對象數組Object[]

    private List<Integer> list = new ArrayList<Integer>();

 

    // 不要使用數組,因為要指定大小,應該使用list替代

    // private String[] array;

 

    public int getCode() {

       return code;

    }

 

    public void setCode(int code) {

       this.code = code;

    }

 

    public String getErrorMsg() {

       return errorMsg;

    }

 

    public void setErrorMsg(String errorMsg) {

       this.errorMsg = errorMsg;

    }

 

    public List<Integer> getList() {

       return list;

    }

 

    public void setList(List<Integer> list) {

       this.list = list;

    }

 

}

 

 

3. 業務方法類service,以上面兩個bean作為入參和回參

BusinessService.java

package com.webservice.service;

 

import java.util.List;

 

import com.webservice.request.Request;

import com.webservice.respone.Response;

 

public class BusinessService {

 

     

    public Response send(Request request)

 

    {

       Response response = new Response();

 

       try {

           //接收基本類型信息

           String msg = request.getMsg();

          

           //接收list

           List<Integer> integerList = request.getList();

 

           System.out.println("收到基本類型消息:msg=" + msg);

           System.out.println("收到List<Integer>類型消息:list=" + integerList);

           

           //組織反饋

           if (null != msg && !"".equals(msg)) {

              //設置錯誤碼

              response.setCode(0);

              //設置錯誤消息

              response.setErrorMsg("調用成功");

              //設置list

              response.setList(request.getList());

 

           } else {

              response.setCode(-1);

              response.setErrorMsg("消息不能為空");

           }

       } catch (Exception e) {

           response.setCode(-1);

           response.setErrorMsg("發生異常:" + e.getMessage());

       }

       return response;

    }

}

 

 

4.在工程的WEB-INF目錄下 編寫deploy.wsdd

主要用來定義service名字,描述service、入參、回參

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

    <service name="businessService" provider="java:RPC">

       <parameter name="className" value="com.webservice.service.BusinessService" />

       <parameter name="allowedMethods" value="*" />

       <beanMapping qname="myNS:Request" xmlns:myNS="urn:BeanService"

           languageSpecificType="java:com.webservice.request.Request" />

       <beanMapping qname="myNS:Response" xmlns:myNS="urn:BeanService"

           languageSpecificType="java:com.webservice.respone.Response" />

    </service>

</deployment>

 

5. 在工程的WEB-INF目錄下編寫undeploy.wsdd

用來卸載webservice服務

<undeployment xmlns="http://xml.apache.org/axis/wsdd/">

   <service name="businessService"/>

</undeployment>

 

6. 部署項目(啟動tomcat),接下來發布接口(關鍵一步)

進入到tomcat的項目中的WEB-INF目錄下,執行下列命令進行發布。會在此WEB-INF下生成server-config.wsdd文件(以后可以在此目錄配置其他接口)

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://192.168.30.143:8080/webservice/servlet/AxisServlet deploy.wsdd

 

Ps:下面命令用於取消一個已經發布的服務

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://192.168.30.143:8080/webservice/servlet/AxisServlet undeploy.wsdd

 

7.獲取wsdl(完成)

(1)重啟tomcat,訪問工程目錄,如:http://192.168.30.143:8080/webservice/servlet/AxisServlet(其中webservice為工程名)

(2)可以看到新的服務方法businessService,點擊一下,跳到wsdl內容頁面,ctr+A拷貝到文本編輯器,去掉開頭的空格,替換去掉所有開頭的“-”為空(即將- <替換為<);另存為businessService.wsdl,即可提供其他方使用,注意:如果部署在linux上,要訪問linux的網頁獲取wsdl,不然可能會有問題

-----------------------------------------------至此發布完畢------------------------------------------------

 

 

 

3.測試驗證

1.根據wsdl生成客戶端代碼

(1)首先制作生成代碼工具,方便以后重用;

在D:\webservice,放個axis1.4的包,創建一個批處理文件“wsdl生成java客戶端文件.bat”,內容如下:根據實際情況配置

set Axis_Lib=D:\webservice\axis1.4\axis\WEB-INF\lib

set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%

set Output_Path=D:\webservice\Testclient

set Package=com.webservice.client

%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% D:\webservice\businessService.wsdl

@echo  -------------OK-----------------

@echo ---The code has been created in the folder: Testclient---

@pause

說明:藍色部分根據實際情況調整

Axis_Lib 是axis1.4的lib位置

Output_Path是生成客戶端代碼存放位置

Package 是生成客戶端代碼所在包

最后是wsdl文件位置

(2)生成客戶端代碼

將wsdl文件,如businessService.wsdl放到D:\webservice下(上一步應該做了),執行文件“wsdl生成java客戶端文件.bat”,即可生成客戶端代碼,在Testclient目錄。

2.測試接口

將生成的客戶端帶拷貝到java或其他web工程的src下

建立測試java類,如Test.java,測試完成

public class Test {

    public static void main(String[] args) throws RemoteException,

           ServiceException, MalformedURLException

    {

       // BusinessServiceService為接口;BusinessServiceServiceLocator為接口實現類

       BusinessServiceService service = new BusinessServiceServiceLocator();

       // 設置要使用的接口服務地址:多用於動態調用不同服務器上的接口

       URL portAddress = new URL(

               "http://192.168.30.143:8080/webservice/services/businessService");

       BusinessService client = service.getbusinessService(portAddress);

 

       Request requestBean = new Request();

      

       // 傳遞簡單類型

       requestBean.setMsg("wwww.servyou.com.cn");

      

       // 傳遞數組,最好先由list轉化

       List<Integer> list = new ArrayList<Integer>();

       for (int i = 0; i < 10; i++)

       {

           list.add(i);

       }

       requestBean.setList(list.toArray());

      

       // 調用webservice

       Response resp = client.send(requestBean);

       System.out.println("消息已發送...");

 

       //接收返回結果

       int code = resp.getCode();

       String errorMsg = resp.getErrorMsg();

      

       Object[] integerList = resp.getList();

 

       System.out.println("收到消息:");

       System.out.println("錯誤碼 code="+code);

       System.out.println("消息 errorMsg="+errorMsg);

       System.out.println("收到List<Integer>類型消息:list=" + Arrays.toString(integerList));

    }

}

 

 

服務端運行結果:

收到基本類型消息:msg=wwww.servyou.com.cn

收到List<Integer>類型消息:list=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

客戶端運行結果:

消息已發送...

收到消息:

錯誤碼 code=0

消息 errorMsg=調用成功

收到List<Integer>類型消息:list=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM