jaxws-webservice編程續

前言:

在次日的學習中,咱們瞭解了jaxws如何返回一個List<String>類型的相對複雜的java數據類型給客戶端,在今天,咱們將更深刻一步作一個真正的Java複雜類型的Webservice的傳輸調用。java

目標: node

1. 用Webservice調用和返回Java的複雜類型(好比說:List<Student>這樣的數據)web

1、編寫Server端

1.1製做JAVA BEAN-Person對象

此次咱們將返回一個List<Person>類型給客戶端。瀏覽器

先來製做咱們的Person類,代碼以下:tomcat

package ctsjavacoe.ws.fromjava.bean;app

import java.io.*;eclipse

public class Person implements Serializable {webapp

    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輸出。

1、編寫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>()去把它接出來就好了。

運行該客戶端,獲得以下輸出:

3、結束第三天

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

在將來兩天的學習中,咱們將使用jaxws的MTOM feature,用webservice來傳輸二進制文件,好比說:jpg/gif圖片

相關文章
相關標籤/搜索