一、服務的發佈html
第一步:寫一個服務接口。java
import javax.jws.WebService;web
@WebService
public interface HelloService {編程
String say(String name);
}瀏覽器
第二步:實現這WS接口,在實現類中完成具體業務邏輯,以下:ide
import javax.jws.WebService;工具
@WebService(
serviceName="HelloService",
portName="HelloServicePort",
endpointInterface="cn.caixw.demo.webservice.HelloService")
public class HelloServiceImpl implements HelloService {spa
@Override
public String say(String name) {
// TODO Auto-generated method stub
return "hello"+name;
}.net
}命令行
第三步:寫一個Server類,用於發佈WS,直接使用JDK提供的工具便可實現。
public class WebServer {
public static void main(String[] args) {
String address="http://localhost:8080/ws/soap/hello";
HelloService helloService=new HelloServiceImpl();
Endpoint.publish(address, helloService);
System.out.println("service published");
}}
只須要使用JDK提供的javax.xml.ws.Endpoint便可發佈WS,只須要提供一個WS
的地址,還須要提供一個服務實例。
第四步:打開瀏覽器,在地址欄中輸入一下地址:
http://localhost:8080/ws/soap/hello?wsdl
在瀏覽器中看到以下代碼:
二、經過客戶端調用WS
第一步:使用JDK提供的命令行生成WS客戶端jar包。
在jdk的安裝目錄下有個bin目錄,裏面存放了大量的命令行工具,其中,有一個名爲wsimport的命令行工具,正是用來經過WSDL生成WS客戶端代碼,
只要輸入以下命令行便可:
wsimport http://xxxxxxxx?wsdl ------>經過wsdl地址生成class文件 到當前目錄
jar -cf client.jar . ------> 將當前目錄生成jar包
mdir . -------->刪除當前目錄內容
第二步:寫一個Client類,用於調用WS,須要使用上一步生成的WS客戶端jar包。
將生成的client.jar導入到項目的classpath中,客戶端代碼以下:
public static void main(String[] args) {
HelloService_Service helloFactory=new HelloService_Service(); ----->相似於服務工廠。
HelloService helloService1=helloFactory.getHelloServicePort(); ----->獲取服務
System.out.println(helloService1.say("bangbang")); ------>調用服務
}
這是一個典型的「代理模式」應用場景,咱們其實是經過面向代理對象來調用WS的,而且這是一種「靜態代理」,
其實JDK已經具有了動態代理的功能,對於WS而言,JDK一樣也提供了很好的工具,就像下面這段代碼那樣:
try {
URL wsdl=new URL("http://localhost:8080/ws/soap/hello?wsdl");
QName serviceName=new QName("http://webservice.demo.caixw.cn/","HelloService");
QName portName=new QName("http://webservice.demo.caixw.cn/","HelloServicePort");
Service service=Service.create(wsdl, serviceName);
HelloService helloService=service.getPort(portName, HelloService.class);
System.out.println(helloService.say("fack"));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
此時,只須要在本地提供一個HelloService的接口,無需client.jar,直接面向WSDL編程,只不過須要定義serviceName和portName這2個東西,
最後才能調用JDK提供的javax.xml.ws.Service類生成service對象,它一樣是一個工廠對象,經過該工廠對象獲取咱們須要的HelloService實例。
貌似這樣方式也不是特別動態,畢竟HelloService接口仍是須要自行提供的。