在具體介紹這兩種框架下的webservice之前,先跟大家交流一下SOA認識,也就是面向服務的體系結構。SOA所要解決的主要問題是在現有基礎環境的前提下,通過對現有應用程序和基礎結構進行重新的組合以應對不斷變化的業務需求。SOA憑藉其松耦合的特性,使得企業可以按照模塊化的方式來添加新服務或更新現有服務,以解決新的業務需要,而其對外提供服務的主要方式之一就是我們今天所要介紹的webservice。目前來講比較有名的webservice框架大致有四種JWS,Axis,XFire以及CXF。今天我們主要介紹前兩種。
1. JWS-WebService.JWS是java語言實現的一種webservice,用來開發和發佈服務,它是一個輕量級的WS框架,實現起來也非常的簡單,下面通過一個小demo來看一下JWS是如何實現的:
(1) 定義接口,並將接口發佈成webservice:
package org.zttc.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IMyService {
@WebResult(name="addResult")
public int add(@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);
}
(2).定義接口實現:
package org.zttc.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(endpointInterface="org.zttc.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 User login(@WebParam(name = "username") String username,
@WebParam(name = "password") String password) {
System.out.println(username + " is logging");
User user = new User();
user.setId("1");
user.setUsername(username);
user.setPassword(password);
return user;
}
}
(3).發佈服務:
package org.zttc.service;
import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args){
String address = "http://localhost:8888/ns";
Endpoint.publish(address, new MyServiceImpl());
}
}
(4).編寫測試類代碼:
package org.zttc.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 {
//創建訪問wsdl服務地址的url
URL url = new URL("http://localhost:8888/ns?wsdl");
//通過QName指明服務的和具體信息
QName sname= new QName("http://service.zttc.org/","MyServiceImplService");
//創建服務
Service service = Service.create(url,sname);
//實現接口
IMyService ms =service.getPort(IMyService.class);
System.out.println(ms.add(12, 33));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通過上面的代碼我們可以看出在調用webservice的同時我們仍然需要知道對應的java類(接口),但調用webservice的情況往往兩發生在個不同系統之間的,事先無法獲取對應的接口,這時我們因該怎樣解決這個問題呢?很簡單,我們可以通過jdk,使用導出命令,將wsdl中的接口描述來生成這個接口以及實現類,然後將生成的接口和實現類應用在我們自己的java程序中就可以了,具體的生成命令是: Wsimport -d E:/我的酷盤/我的工程/java項目/webservice/01/ -keep -verbose http://localhost:6666/ns?wsdl .
2 . 基於Axis2框架的webservice。相對於JWS來說Axis2是一個重量級的webservice框架,準確說它是一個Web Services / SOAP / WSDL的引擎,它不但能製作和發佈WebService,而且可以生成Java和其他語言版WebService客戶端和服務端代碼。也正是由於Axis2做了非常優秀的封裝,使得我們在使用Axis2-WS的時候非常的簡單,下面通過一個小例子跟大家介紹一下Axis2的應用。
(1). 首先我們要做的是下載axis.war,並將這個war包發佈到我們的tomcat的webapps下。啓動tomcat,訪問:http://localhost:8080/axis2/,如果界面顯示如下則說明發布成功:(2).編寫我們的java類。注意我們所建立的java類不要放在任何包中,直接放在src下即可,代碼如下:
public class MyService {
public String sayHello(String name,boolean isMan) {
if(isMan) {
return "Hello,Mr "+name+"! Welcome to Webservice";
} else {
return "Hello,Miss "+name+"! Welcome to Webservice";
}
}
}
(3).將我們建好的class類放到%tomcat%\webapps\axis2\WEB-INF\pojo文件夾下(如果沒有該文件夾請新建一個並以pojo命名)。做完這一步之後啓動tomcat,訪問http://localhost:8080/axis2/services/listServices,如果出現如下界面則說明發布成功:
(4).發佈好之後我們就可以編寫客戶端嘗試調用webservice,客戶端代碼如下:
package com.unimas.datacollection.webservices.client;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import javax.xml.namespace.QName;
public class Client {
public static void main(String[] args) throws Exception {
// 使用RPC方式調用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定調用WebService的URL
EndpointReference er = new EndpointReference(
"http://localhost:8080/axis2/services/MyService");
options.setTo(er);
// 指定sayHello方法的參數值
Object[] opAddArgs = new Object[] { "張三", false };
// 指定sayHello方法返回值的數據類型的class對象
Class[] classs = new Class[] { String.class };
// 指定要調用的sayHello方法及wsdl文件的命名空間,第一個參數表示WSDL文件的命名空間
// 通過訪問http://localhost:8080/axis2/services/MyService?wsdl 就可以看見
// 元素的targetNamespace屬性值
QName qname = new QName("http://ws.apache.org/axis2", "sayHello");
// 調用sayHello方法並輸出該方法的返回值
// 這裏有三個參數的意思:1,是QName對象,表示要調用的方法名;2,webservice的參數值,參數類型是Object[];3,返回值class對象,參數類型是Class[],
System.out.println(serviceClient.invokeBlocking(qname, opAddArgs,
classs)[0]);
}
}
至此Axis2-WS發佈完成,執行客戶端代碼即可在控制檯輸出調用結果。以上是對JWS和Axis2具體應用的簡單介紹,對比這兩種應用可以發現使用JWS比較靈活,我們可以隨意的增加服務而不需要一次次的重新部署,但是我們所要做的工作量是比較大的。而使用Axis2對於開發webservice來講相當的簡單,我們唯一需要做的就是開發一個普通的java類,然後放到tomcat的對應文件夾下即可,可以說小有小的好處,大有大的優勢。