Java 6 WebServiceの開発例


1.Webプロジェクトwstest用Eclipseを新規作成し、右クリックしてWebプロジェクトを新規作成すればよい.2.パッケージの作成
com.test.ws 

3.サービス側クラスファイルcomを作成する.test.ws.Hello.java
package com.test.ws;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Endpoint;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style = Style.RPC)
public class Hello {
	/**
	 * Web        
	 * 
	 * @return      
	 */
	public String sayHi(String name) {
		return "hi," + name;
	}

	public static void main(String[] args) {
		//     WebService
		Endpoint.publish("http://localhost:81/hello", new Hello());
	}
}

 
注意:JDKバージョンの関係で、私が使用しているバージョンに@SOAPBinding(style=Style.RPC)を付けなければなりません.そうしないと、「Wrapper class com.test.ws.jaxws.SayHi is not found.Have you run APT to generate them?」とエラーが発生します.4.テストサーバ側プログラム(1)はHelloを実行する.JAva(2)ブラウザに次のように入力します.http://localhost:81/hello?wsdl対応する説明情報が表示されます
 
5.クライアントの作成(一)方式一、DOSコマンドラインの状態を自動的に作成(1)し、wstestプロジェクトのsrcディレクトリに入る(2)D:workspacewstestsrc>wsimport-pcom.test.ws.client -keep http://localhost:81/hello?wsdl注意:まずハローを実行してください.JAva、サービスを先にオンにして、さもなくば(3)Eclipseに入って、F 5を押してwstestプロジェクトをリフレッシュして、comを発見します.test.wsは1つのディレクトリclientを追加し、clientディレクトリの下に4つのファイルが自動的に作成されます:Hello.class、Hello.java、HelloService.class、HelloService.JAva(4)クライアントテストクラスcomを新規作成する.test.ws.client.TestClient.java
package com.test.ws.client;

public class TestClient {
	public static void main(String args[]) {
		Hello hello = new HelloService().getHelloPort();
		String msg = hello.sayHi("tom");
		System.out.println(msg);
	}
}

(5)TestClient.の実行JAvaは、hi,tomという結果を出力します.
 
(二)方式二、手動でクライアントを作成する
(1)サービス側に対応するインタフェースcomを作成する.test.ws.client.HelloInte.java
package com.test.ws.client;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "Hello", targetNamespace = "http://ws.test.com/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloInte {

	@WebMethod
	@WebResult(partName = "return")
	public String sayHi(@WebParam(name = "arg0", partName = "arg0") String arg0);
}

(2)クライアントテストクラスcomを作成する.test.ws.client.TestClient.java
package com.test.ws.client;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;

public class TestClient {
	public static void main(String[] args) throws Exception {
		URL url = new URL("http://localhost:81/hello?wsdl");

		//          URI
		//        WSDL      
		QName qname = new QName("http://ws.test.com/", "HelloService");

		//     
		Service service = Service.create(url, qname);

		//       ,  “  ”。
		HelloInte h = service.getPort(HelloInte.class);

		System.out.println(h.sayHi("michael"));
		System.out.println(h.sayHi("tom"));
	}
}

(3)TestClientを実行すると、hi,michael hi,tomという結果になる
補足:サービス側とクライアントの相関性を検証するために、Helloを停止します.JAva後、TestClient.JAvaは、エラーを報告します.クライアントのアクセスがサーバ側に関連していることを示します.6.WEB方式配置(1)comを作成する.test.ws.client.servlet.PubServlet.java
package com.test.ws.servlet;

import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.xml.ws.Endpoint;
import com.test.ws.Hello;

public class PubServlet extends GenericServlet {
	public PubServlet() {
		super();
	}

	public void destroy() {
		super.destroy();
	}

	@Override
	public void init() throws ServletException {
		super.init();
		System.out.println("start run webservice...");
		Endpoint.publish("http://localhost:81/hello", new Hello());

		System.out.println("Webservice is running...");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
	}
}

(2)webを修正する.xml
<servlet>
           <servlet-name>PubServlet</servlet-name>
            <servlet-class>com.test.ws.servlet.PubServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>

      <servlet-mapping>
            <servlet-name>PubServlet</servlet-name>
            <url-pattern>/servlet/PubServlet</url-pattern>
    </servlet-mapping> 

 
注意:ここではPubServeretを自動的に起動させるため、load-on-startupを1に設定します.(3)配信完了,webサービス開始(4)TestClient.の実行JAvaテスト7.まとめ(1)はmain()メソッドで直接実行してもservletで発行してもEndpointを実行している.publish()メソッド(2)webで公開する場合,webserviceで使用するポートはwebコンテナで使用するポートとは別にしなければならない(3)xfireと比較して,この方式でサードパーティ製パッケージを入れなくても開発が容易である.でも、個人的にはxfireの方が好きです.現在、このようなクライアントの実現は私にあまり爽やかではありません.また、Webコンテナでのパブリケーションもxfireがなく便利です.