5天學會jaxws-webservice編程第三天

來源:互聯網
上載者:User

標籤:cts   方式   student   alt   odi   response   string   port   編程   

前言:

在第二天的學習中,我們瞭解了jaxws如何返回一個List<String>類型的相對複雜的Java資料類型給用戶端,在今天,我們將更深入一步做一個真正的Java複雜類型的Webservice的傳輸調用。

目標:

1. 用Webservice調用和返回Java的複雜類型(比如說:List<Student>這樣的資料)

一、編寫Server端1.1製作JAVA BEAN-Person對象

這次我們將返回一個List<Person>類型給用戶端。

先來製作我們的Person類,代碼如下:

package ctsjavacoe.ws.fromjava.bean;

import java.io.*;

public class Person implements Serializable {

    private String name = "";

    private int age = 0;

    private String gender = "";

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public int getAge() {

       return age;

    }

    public void setAge(int age) {

       this.age = age;

    }

    public String getGender() {

       return gender;

    }

    public void setGender(String gender) {

       this.gender = gender;

    }

}

1.2製作Service端

package ctsjavacoe.ws.fromjava;

import java.util.ArrayList;

import java.util.List;

import ctsjavacoe.ws.fromjava.bean.*;

import javax.jws.WebMethod;

import javax.jws.WebService;

@WebService

public class JavaComplexType {

    @WebMethod

    public List<Person> getPerson() {

       List<Person> testList = new ArrayList<Person>();

       Person p = new Person();

       p.setName("abc");

       p.setAge(31);

       p.setGender("female");

       testList.add(p);

       p = new Person();

       p.setName("def");

       p.setAge(33);

       p.setGender("male");

       testList.add(p);

       p = new Person();

       p.setName("aaa");

       p.setAge(26);

       p.setGender("female");

       testList.add(p);

       return testList;

    }

}

該Service沒有Input,只有一個Output,該Output為一個List<Person>類型,它將返回一個List給用戶端,該List中有三條Person結構的資料

1.2編譯

此處的Webservice Server端產生的全部詳細過程請參見“第一天”教程中的描述。

1. 用wsgen來編譯產生相關的java檔案,wsdl檔案與xsd檔案;

2. 將編譯時間輸出至wssrc目錄的檔案拷貝至src目錄;

3. 修改WebContent\WEB-INF目錄下的sun-jaxws.xml檔案,加入:

<endpoint name=‘JavaComplexType‘

 implementation=‘ctsjavacoe.ws.fromjava.JavaComplexType‘

                  url-pattern=‘/JavaComplexTypeService‘ />

 

 

 

 

4.修改WebContent\WEB-INF目錄下的web.xml加入:

<servlet>

<servlet-name>JavaComplexType</servlet-name>

<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>

       <load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

       <servlet-name>JavaComplexType</servlet-name>

       <url-pattern>/JavaComplexTypeService</url-pattern>

</servlet-mapping>

5. 將JaxWSProject的WebContent目錄下的檔案拷貝至tomcat的webapps\JaxWSSample

目錄下,並選擇全部覆蓋;

6.重啟Tomcat;

7.開啟一個IE瀏覽器,輸入:

http://localhost:9090/JaxWSSample/JavaComplexTypeService?wsdl ,可以看到如下的wsdl輸出。

 

一、編寫Client端2.1編譯前的準備

 

此處的Webservice Client端產生的全部詳細過程請參見“第一天”教程中的描述。

1.  把Server端產生的wsdl與xsd拷貝至client工程的wsdl目錄下

2.  將ctsjavacoe.ws.fromjava.bean.Person這個類拷貝到client工程的相應的src目錄下,因為在第二天中,我們使用的是List<String>,String對應的xsd中的string是webservice的一個基本類型,因此不需要在用戶端再造型。

而我們這次的返回是一個List<Person>,這個person類可不是xsd所本身擁有的資料類型,因此當用戶端得到webservice的返回時,需要在用戶端對這個Person做造型,而造型時需要有一個Object來告訴用戶端我造出的型是什麼東東,因此這邊比第二天教程中多出了一步,即手工拷貝Person類至Client工程

3.  由於我們繼續使用polling方式來書寫非同步用戶端調用,因此我們還需要開啟binding.xml檔案,更改一下:

<?xml version="1.0" encoding="UTF-8"?>

<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

wsdlLocation="wsdl/JavaComplexTypeService.wsdl"

    xmlns="http://java.sun.com/xml/ns/jaxws">

<bindings node="wsdl:definitions">

       <enableAsyncMapping>true</enableAsyncMapping>

</bindings>

</bindings> 

4.  使用wsimport命令來產生client端調用時所需要的“控制代碼”

5.  把產生的控制代碼中的JavaComplexTypeService.java這個檔案開啟,編輯它,將裡面兩處Url url=……的地方改成你的Server端實際的Webservice的wsdl地址,而預設它是指向一個本地的wsdl檔案的路徑

 

2.2書寫Test用戶端調用Webservice的Server端

package ctsjavacoe.ws.fromjava;

import javax.xml.ws.Response;

import java.util.*;

import ctsjavacoe.ws.fromjava.bean.*;

public class JavaComplexTypePollingClient {

    public static void main(String[] args) {

       JavaComplexTypeService service = new JavaComplexTypeService();

       JavaComplexType port = service.getJavaComplexTypePort();

       Response<GetPersonResponse> getPersonAsync = port.getPersonAsync();

       while (!getPersonAsync.isDone()) {

           System.out.println("is not done");

       }

       List<Person> rtnList = new ArrayList<Person>();

       try {

           GetPersonResponse getPersonResponse = getPersonAsync.get();

           rtnList = getPersonResponse.getReturn();

           System.out.println("return size======" + rtnList.size());

           for (Person p : rtnList) {

              System.out.println("person=====" + p.getName() + "  "

                     + p.getAge() + "  " + p.getGender());

           }

       } catch (Exception ex) {

           ex.printStackTrace();

       }

    }

}

 

 

當我們在eclipse裡鍵入getPersonResponse.getReturn()

 

可以看到jaxws已經幫我們把List<Person>轉型過來了,我們只需要用相應的泛型:

List<Person>rtnList = new ArrayList<Person>()去把它接出來就行了。

運行該用戶端,得到如下輸出:

 

三、結束第三天

 

通過第二天,第三天的學習,我們已經基本掌握了jaxws一般的應用,對於java複雜類型的傳輸有了全面的瞭解。

在未來兩天的學習中,我們將使用jaxws的MTOM feature,用webservice來傳輸二進位檔案,比如說:jpg/gif圖片

5天學會jaxws-webservice編程第三天

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.