JAX-WS Web Service
http://www.cnblogs.com/decarl/archive/2012/05/15/2502074.html
Web Service開篇
1、第一個實例
建立一個Java Web Service需要三個步驟:1、創(chuàng)建接口;2、創(chuàng)建實現(xiàn)類;3、開啟服務
?
1.1、創(chuàng)建接口 IMyService
????在Eclipse中新建一個Java Project,添加一個包org.decarl.service
?
在包中添加接口IMyService
在接口上添加Annotation @WebService,在接口里定義兩個方法
?
package org.decarl.service;
?
import javax.jws.WebService;
?
@WebService
public interface IMyservice {
????public int add (int a, int b);
????public int minus (int a, int b);
}
?
1.2 創(chuàng)建實現(xiàn)類 MyServiceImpl
重點注意在類定義上面加上Annotation
?
@WebService(endpointInterface = "org.decarl.service.IMyservice")
?
其中endpointInterface指的是對外提供服務的接口
?
?
代碼實現(xiàn)如下:
?
?
package org.decarl.service;
?
import javax.jws.WebService;
?
@WebService(endpointInterface = "org.decarl.service.IMyservice")
public class MyServiceImpl implements IMyservice {
?
????@Override
????public int add(int a, int b) {
????????System.out.println(a + "+" + b + "=" + (a + b) );
????????return a + b;
????}
?
????@Override
????public int minus(int a, int b) {
????????System.out.println(a + "-" + b + "=" + (a - b) );
????????return a - b;
????}
}
?
?
1.3 創(chuàng)建服務(開啟服務)
核心是 Endpoint.publish函數(shù)
?
代碼如下:
?
package org.decarl.service;
import javax.xml.ws.Endpoint;
public class MyService {
????public static void main(String[] args) {
????????String address = "http://localhost:8888/ns";
????????
????????//第二個參數(shù):要發(fā)布這個接口的哪一個實現(xiàn)類
????????Endpoint.publish(address, new MyServiceImpl());
????????
????????//SEI Service Endpoint Interface 服務提供的接口:IMyService
????????//SIB Service Implements Bean 服務實現(xiàn)的Bean:MyServiceImpl
????}
}
1.4、建立一個TestClient進行測試
package org.decarl.service;
?
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
?
public class TestClient {
????public static void main(String[] args) {????
????????try {
????????????//創(chuàng)建訪問wsdl服務地址的URL
????????????URL url = new URL("http://localhost:8888/ns?wsdl");
????????????//通過QName指明服務的具體信息
????????????QName sName = new QName("http://service.decarl.org/", "MyServiceImplService");
????????????//創(chuàng)建服務
????????????Service service = Service.create(url, sName);
????????????//實現(xiàn)接口
????????????IMyservice ms = service.getPort(IMyservice.class);
????????????System.out.println(ms.add(12, 13));
????????????
????????????//以上服務有問題,依然依賴于IMyservice接口
????????????
????????} catch (MalformedURLException e) {
????????????e.printStackTrace();
????????}????
????}
}
這個類中的QName、Service 之后介紹
?
1.5、啟動測試
1.5.1 、啟動MyService類(啟動服務)
?
右鍵->Run as->Java Application
?
?
控制臺輸出如下:
?
?
?
之后在瀏覽器中輸入地址:http://localhost:8888/ns?wsdl
頁面顯示如下:
?
?
其中TestClient類中的QName構造方法的參數(shù)對應著上圖中紅框中的tagetNameSpace和name
?
QName sName = new QName("http://service.decarl.org/", "MyServiceImplService");
?
?
1.5.2、調(diào)用這個服務
在TestClient類中右鍵->Run as->Java Application
?
控制臺輸出如下:
?
?
但是此時還是依賴IMyservice, 服務的調(diào)用是通過WSDL即可完成
WSDL可能是Java或者.NET開發(fā)生成的
?
?
2、第一個實例改進
2.1、wsimport 命令 (通過WSDL生成本地的服務class文件)
wsimport -d D:/wsimport/ -keep -verbose http://localhost:8888/ns?wsdl
wsimport -d D:/wsimport -keep -verbose http://localhost:8888/ns?wsdl
wsimport -d D:\wsimport -keep -verbose http://localhost:8888/ns?wsdl
?
注意:如果被指定的目錄D: /wsimport 在D盤,則應該先將命令提示符切換到D盤再執(zhí)行上述命令
?
-keep參數(shù)會在生成class文件的同時也生成java文件
-verbose 生成詳細信息
?
2.2、新建一個項目來測試生成的class
2.2.1、新建一個Java 項目,將剛剛生成的包拷貝到源代碼的目錄
?
復制org,然后在src文件夾上右鍵粘貼
?
?
?
2.2.2、將原來的TestClient直接復制到這個項目中就可以直接運行了
?
2.2.3、創(chuàng)建另一種訪問方式
?
新建一個類 TestClient2
?
代碼如下:
package org.decarl.service;
?
public class TestClient2 {
?
????public static void main(String[] args) {
????????//MyServiceImplService通過WSDL生成的用于做訪問的類
????????MyServiceImplService msis = new MyServiceImplService();
????????IMyservice ms = msis.getMyServiceImplPort();
????????System.out.println(ms.minus(29, 11));
????}
}
?
其中MyServiceImplService這個類是wsimport生成的用于提供服務接口訪問的類
?
?
2.3、wsimport命令的其他參數(shù)
-p 指定包名 不加-keep (-keep生成java文件)
wsimport -d D:/wsimport/ -p test -verbose http://localhost:8888/ns?wsdl
?
?
-d 指定生成的目錄
-keep 指定是否生成.java源文件
-verbose 顯示生成的詳細過程及信息
http://localhost:8888/ns?wsdl 網(wǎng)絡中的WSDL文件
?
?
?
3、WSDL分析
3.1、WSDL五大部分
3.1.1、 types:用來定義訪問的類型
3.1.2、message:SOAP
3.1.3、portType:指明服務器的接口,并且通過operation綁定相應的in和out的消息:其中in表示參數(shù),out表示返回值
3.1.4、binding:指定傳遞消息所使用的格式
3.1.5、service:指定服務所發(fā)布的名稱
?
?
?
4、使用系統(tǒng)提供的豐富的Annotation
?
修改第一個項目中IMyService
?
package org.decarl.service;
?
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
?
@WebService
public interface IMyservice {
???? ?
????
????@WebResult(name = "addResult")
????public int add (@WebParam(name="a")int a, @WebParam(name="b")int b);
????
????@WebResult(name = "minusResult")
????public int minus (@WebParam(name="a")int a, @WebParam(name="b")int b);
}
?
?
?
于是對應生成的WSDL type會相應的改變
?
?
打了紅框的部分已經(jīng)隨著Annotation改變了
?
原來的代碼和WSDL,注意打紅框的部分
package org.decarl.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
?
@WebService
public interface IMyservice {
????public int add (int a, int b);
????public int minus (int a, int b);
}
?
再加一個比較明顯的例子
package org.decarl.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
?
@WebService
public interface IMyservice {
????
????@WebResult(name = "addResult111111111111")
????public int add (@WebParam(name="a111111111111")int a,
???????????? @WebParam(name="b111111111111")int b);
????
????@WebResult(name = "minusResult222222222222")
????public int minus (@WebParam(name="a222222222222")int a,
???????????? @WebParam(name="b222222222222")int b);
}
?
?
?
5、傳遞類類型的數(shù)據(jù)(傳遞對象數(shù)據(jù))
5.1 在第一項目中添加一個User類(實體類)
?
package org.decarl.service;
?
public class User {
????private int id;
????private String username;
????private String password;
????public int getId() {
????????return id;
????}
????public void setId(int id) {
????????this.id = id;
????}
????public String getUsername() {
????????return username;
????}
????public void setUsername(String username) {
????????this.username = username;
????}
????public String getPassword() {
????????return password;
????}
????public void setPassword(String password) {
????????this.password = password;
????}
}
?
5.2、在IMyservice接口中添加一個和User有關的方法Login
?
package org.decarl.service;
?
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
?
@WebService
public interface IMyservice {
???? ?
????
????@WebResult(name = "addResult")
????public int add (@WebParam(name="a")int a,
???????????? @WebParam(name="b")int b);
????
????@WebResult(name = "minusResult")
????public int minus (@WebParam(name="a")int a,
???????????? @WebParam(name="b")int b);
????
????@WebResult(name = "loginUser")
????public User login(@WebParam(name = "username")String username,
???????????? @WebParam(name = "password")String password);
????
}
?
5.3、在實現(xiàn)類MyServiceImpl中添加login方法的實現(xiàn)
package org.decarl.service;
?
import javax.jws.WebService;
?
@WebService(endpointInterface = "org.decarl.service.IMyservice")
public class MyServiceImpl implements IMyservice {
?
????@Override
????public int add(int a, int b) {
????????System.out.println(a + "+" + b + "=" + (a + b) );
????????return a + b;
????}
?
????@Override
????public int minus(int a, int b) {
????????System.out.println(a + "-" + b + "=" + (a - b) );
????????return a - b;
????}
?
????@Override
????public User login(String username, String password) {
????????System.out.println(username + "is logining");
????????User user = new User();
????????user.setId(1);
????????user.setUsername(username);
????????user.setPassword(password);
????????return user;
????}
}
?
下面來看WSDL是怎么生成對象的
?
?
?
上面紅框中的文字:
loginResponse類型在下面定義(沿著藍色箭頭),而loginResponse中又定義了user類型;user類型是一個包含了一個xs:int類型和兩個xs:string類型的類型
?
總結
以上是生活随笔為你收集整理的JAX-WS Web Service的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Web Service 学
- 下一篇: Spring MVC中的视图解析View