關於WebService的一些操作。。。
WebService
簡介:
簡單來說就是一個我們可以自定義需要發布的服務來供其它客戶端來調用的一種模式 他分為兩個部分一個為服務端一個為客戶端 服務端是用來寫我們的需要調什麽的服務 客戶端就是我們具體的需求通過調用服務端的方法來接收返回值的一種模式
特點:
概括來說三種:
1.跨語言 2.跨平臺 3.遠程調用
缺點:
由於他的數據是采用XML來傳輸的所以解析時需要時間所以性能不是很高
建議使用的場景:
1.不考慮客戶端的類型
2.遠程調用的場景
3.不考慮性能
不建議使用的場景:
1.性能要求較高的
2.同構程序
WebService三要素
1.SOAP: 協議
2.WSDL:使用手冊---裏面可以查看我們的服務到底有什麽 以及服務自定義的方法以及方法的參數都可以看見
swdl的主要結構(xml格式的):
<service> |
服務視圖,WebService的服務端點 |
<binding> |
Web Services的通信協議,還描述Web Services的方法、輸入、輸出。 |
<portType> |
描述了WebService可執行的操作,通過binding指向portType |
<message> |
描述了服務中發布的方法,包括參數,返回值等。 |
<types> |
定義了WebService中使用的數據類型 |
3.UDDL:目錄---跨產業跨平臺的開放性架構
=====================================================================================================================================
自定義發布服務:
我們以自定義查詢天氣的來舉例
首先定義一個查詢天氣的接口
public interface IWeatherService {
public String queryWeather(String cityName);
}
然後自定義一個類實現這個接口 註意這邊實現這個接口的時候需要加上 註解 @WebService表明當前類為實現類
@WebMethod(exclude=true)方法上面添該註解表示不發布這個方法
public class WeatherServiceImpl implements IWeatherService {
public String queryWeather(String cityName) {
System.out.println("WeatherServiceImpl.queryWeather() " + cityName);
return "大晴天";
}
}
然後自定義發布的方法裏面寫main方法 發布
通過
參數一:發布的服務地址
參數二:自定義的實現類
Endpoint.publish("http://localhost:8080/weatherService", new WeatherServiceImpl());
這樣就可以查看一個服務端是否發布成功了
如果輸入服務地址如下圖所示一個簡單的服務就發布成功了 我們可以在服務的地址後面加上 ?wsdl來查看他的使用手冊 或者說是WSDL
客戶端:
首先要生成服務端代碼:
在cmd環境下 進入自己項目的路徑下然後 通過wsimport -s 服務的路徑 http://127.0.0.1:8088/weather?wsdl(或者是自己下載下來的xml文件路徑) -p 自定義包名 也可以不指定就是默認的
然後就是自定義類進行客戶端的調用
方法一:缺點--服務地址寫死 不靈活 只要發布的服務改變地址就需要重新獲取客戶端代碼
1.創建服務試圖 (wsdl裏面的service標簽的name 屬性 )
WeacherServiceImplService serviceImpl=new WeacherServiceImplService();
2.獲取服務視圖的實現類(wsdl裏面的porttype標簽的 name 屬性)
WeacherServiceImpl service = serviceImpl.getPort(WeacherServiceImpl.class);
3.調用方法:
String result = service.queryWeather("吉首");
4.輸出結果
方法二:
1.設置服務端地址
URL url = new URL("http://localhost:8080/weatherService?wsdl");
2.設置Qname(參數一 wsdl的命名空間 wsdl 裏面的 targetNamespace 屬性的值 參數二 服務視圖的名稱 service的name屬性)
QName qName = new QName("http://impl.service.qf.com/", "WeatherServiceImplService");
3.創建服務試圖
Service service = Service.create(url, qName);
4.得到服務視圖的實現類(wsdl裏面的porttype標簽的 name 屬性)
WeatherServiceImpl weatherServiceImpl = service.getPort(WeatherServiceImpl.class);
5.調用方法
String result = weatherServiceImpl.queryWeather("青海");
方法三: --這種方法不需要生成客戶端代碼 但是要模擬XML的提交方式(重點掌握第二種)
利用CXF發布和調用服務:
Cxf:是一個開源的WebService的框架 他支持的格式有 XML 和 JsON
環境搭建:
1.將下載的文件進行解壓,配置環境變量,新建CXF_HOME,輸入下載文件庫的路徑,
示例:C:\software\apache-cxf-3.2.1\apache-cxf-2.7.11
2.在系統環境變量的Path追加%CXF_HOME%\bin
3.測試,在cmd下加入wsdl2java
服務端:
自定義接口 --- 註意這邊的話不像上面那種模式把註解加載實現類上這種需要加到接口上 @WebService
實現類
然後發布服務:(使用jaws 發布服務)
1.首先獲得工廠
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
2.設置他的服務地址
jaxWsServerFactoryBean.setAddress("http://localhost:8080/WeatherService");
3.設置服務的接口
jaxWsServerFactoryBean.setServiceClass(IWeatherService.class);
4.設置服務的實現類
jaxWsServerFactoryBean.setServiceBean(new WeatherServiceImpl());
5.發布
jaxWsServerFactoryBean.create();
客戶端 :
首先也和上面一樣先是獲得服務端的代碼
wsdl2java常用參數:
-d,指定輸出目錄
-p,指定包名,如果不指定該參數,默認包名是WSDL的命名空間的倒序
客戶端調用:
1.獲得工廠
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
2.設置服務的接口(portType 裏面的name 屬性)
jaxWsProxyFactoryBean.setServiceClass(IWeatherService.class);
3.設置地址
jaxWsProxyFactoryBean.setAddress("http://localhost:8080/WeatherService");
4.獲取服務接口的實例 (將獲得的對象轉換成實現的接口類型)
IWeatherService weatherService = (IWeatherService)jaxWsProxyFactoryBean.create();
5.方法調用;
String result = weatherService.queryWeacher("深圳");
Cxf發布webservice:
JaxWsServerFactoryBean:發布webservice服務
JaxWsProxyFactoryBean:調用webservice服務
CXF整合Spring (配置方式)加入相關的約束條件
發布服務:使用spring和cxf整合的標簽<jaxws:server >
1.創建SEI接口 WebService的終端接口 也就是上面的自定義接口
2.創建實現類
3.配置applicationContext.xml文件
a)加入相關的約束
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
b)利用bean 實例化服務實現類
<!-- 服務實現類 -->
<bean id="weatherServiceImpl" class="com.qf.service.impl.WeatherServiceImpl"/>
c) <!-- 利用jaxws:server發布服務端
address:服務地址
serviceClass:服務接口的全類名
-->
<jaxws:server address="/WeatherService" serviceClass="com.qf.service.IWeatherService">
<jaxws:serviceBean>
<!-- 引入服務的實現類 -->
<ref bean="weatherServiceImpl"/>
</jaxws:serviceBean>
</jaxws:server>
4.配置web.xml自動開啟ToCat的時候開啟Spring
5.配置CXF的Servlet用於解析CXF發布的webService
第六步:啟動tomcat,部署web工程到tomcat**
第七步:測試服務是否發布成功**
WSDL地址規則:http://localhost:端口號/項目名稱/servlet攔截路徑/服務名稱?wsdl
客戶端調用服務:使用spring和cxf整合的標簽<jaxws:client>
‘ 1.成服務端代碼
2.配置Spring
<!--
使用jaxws:client調用服務端
serviceClass:設置服務接口(客戶端生成的服務接口)
address:服務地址
-->
<jaxws:client id="weatherClient" serviceClass="com.qf.springcxf.IWeatherService"
address="http://localhost:8080/cxf_webservice01/ws/WeatherService?wsdl">
</jaxws:client>
然後後面就可以獲取這個實例化的id 獲取實例進行方法的調用了
也可以簡單的使用註解的方式獲取‘
先自動註入
然後調用方法:
CXF發布restFul風格的服務
restFul
--資源定位(url)
--資源的操作
GET、POST、PUT、DELETE
發布服務 以查詢學生的信息舉例
1.首先創建學生的實體類 並在實體類上加上註解
@XmlRootElement(name="student") //@XmlRootElement可以實現對象和XML數據之間的轉換
2.創建接口(重要)
3.實現類
5.發布:
1.編程式發布:JAXRSServerFactoryBean
1.獲得發布的工廠
JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
2.設置服務地址
jaxrsServerFactoryBean.setAddress("http://localhost:8080/studentServie");
3.設置服務的實現類
jaxrsServerFactoryBean.setServiceBean(new StudentServiceImpl());
4.設置資源對象如果多個資源用, 隔開(創建的實體類)
jaxrsServerFactoryBean.setResourceClasses(Student.class);
5.發布
jaxrsServerFactoryBean.create();
-----------------發布後的查看地址為 xxxxx?_wadl
2.配置Spring方式的方式發布
<!-- 配置的方式發布Rest服務 -->
<!-- 服務實現類 -->
<bean id="studentServiceImpl" class="com.qf.service.impl.StudentServiceImpl"/>
<!--
address:服務地址
-->
<jaxrs:server address="/studentService" >
<jaxrs:serviceBeans>
<ref bean="studentServiceImpl"/>
</jaxrs:serviceBeans>
</jaxrs:server>
客戶端調用:
1 .編程方式:
在地址欄輸入需要查詢的方法以及參數
關於WebService的一些操作。。。