JAVA6中開發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.建立用戶端
(一)方式一,自動建立
(1)進入DOS命令列狀態,並進入wstest項目的src目錄
(2)執行如下命令:
D:/workspace/wstest/src>wsimport -p com.test.ws.client -keep http://localhost:81/hello?wsdl
注意:一定要先運行Hello.java,保持服務先開啟,否則會報錯
(3)進入Eclipse中,按F5重新整理wstest項目,會發現com.test.ws會多了一個目錄client,並且client目錄下自動建立了四個檔案: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>
注意:此處要讓PubServlet自動啟動,所以要設load-on-startup為1。
(3)發布完成,啟動web服務
(4)運行TestClient.java測試
7.小結
(1)不管是直接通過main()方法運行,還是通過servlet來發布,其實都是在執行Endpoint.publish()方法
(2)在web中發布時,webservice所用的連接埠必須跟web容器所用的連接埠分開
(3)與xfire相比,通過此種方式不用再倒入第三方包,開發起來比較方便。不過,我個人還是比較喜歡xfire的方式。目前這種用戶端的實現讓我覺得不太爽。另外,它在web容器中的發布也沒有xfire方便。