發(fā)布于:2021-01-11 10:24:19
0
184
0
本文介紹了如何使用JAX-WS API創(chuàng)建基于SOAP的Web服務(wù)并將其與Tomcat一起部署。本教程遵循使用Java的wsimport實用程序逐步編寫客戶端的方法。
本文中顯示的Web服務(wù)已在此處實時部署。
有多種創(chuàng)建Web服務(wù)的方法。在本文中,我們將使用JAX-WS創(chuàng)建基于SOAP的Web服務(wù),該服務(wù)是XML Web Services的Java API,并將其部署在Tomcat下。
要記住的重要一點是,可以使用JAX-WS構(gòu)建SOAP和REST樣式的Web服務(wù)。有一個常見的誤解,即JAX-WS用于創(chuàng)建基于SOAP的Web服務(wù),而JAX-RS用于創(chuàng)建REST風(fēng)格的Web服務(wù)。
JAX-WS API非常豐富,并提供了一些注釋,使開發(fā)人員的工作變得輕松。
不同樣式的基于SOAP的Web服務(wù)
基于SOAP的Web服務(wù)可以歸類為
RPC樣式– RPC樣式用于創(chuàng)建包括簡單數(shù)據(jù)類型(內(nèi)置類型)的SOAP Web服務(wù)。
文檔樣式–這是默認(rèn)樣式,用于創(chuàng)建包含復(fù)雜數(shù)據(jù)類型的SOAP Web服務(wù)
DiscoverIndia Web服務(wù)
我們將創(chuàng)建一個名為DiscoverIndia的基于SOAP的Web服務(wù)。該網(wǎng)絡(luò)服務(wù)的全部意義是,您將印度州的名稱傳遞給該服務(wù),然后您可以檢索
該州的首都
該州的區(qū)數(shù)
該州的當(dāng)?shù)卣Z言
該州的機(jī)場
在該州參觀的地方
關(guān)于國家的一些有趣的事實
在開始實施之前,讓我們了解基于SOAP的Web服務(wù)的體系結(jié)構(gòu)。
因此,事不宜遲,讓我們開始使用代碼。
實施網(wǎng)絡(luò)服務(wù)
這是該服務(wù)的服務(wù)端點接口(SEI)
@WebService public interface Country { @WebMethod String getCapital(String s); @WebMethod String getLanguages(String s); @WebMethod String getAirports(String s); @WebMethod int getDistricts(String s); @WebMethod String getPlacesToVisit(String s); @WebMethod String getInterestingFacts(String s); }
CountryImpl是服務(wù)實現(xiàn)Bean(SIB),用于實現(xiàn)SEI的所有方法。
@WebService public class CountryImpl implements Country { private Utility states; public CountryImpl(){ states=new Utility(); states.loadData(); } @WebMethod public String getCapital(String stateName) { return states.getState(stateName).getCapital(); } @WebMethod public String getLanguages(String stateName) { return states.getState(stateName).getLanguages(); } @WebMethod public String getAirports(String stateName) { return states.getState(stateName).getAirports(); } @WebMethod public int getDistricts(String stateName) { return states.getState(stateName).getDistricts(); } @WebMethod public String getPlacesToVisit(String stateName) { return states.getState(stateName).getPlacesToVisit(); } @WebMethod public String getInterestingFacts(String stateName) { return states.getState(stateName).getInterestingFacts(); } }
請注意,在CountryImpl類中,我們有Utility類的成員,該類將狀態(tài)信息存儲在Map中。
這是國家類別,代表使用吸氣劑和吸氣劑的國家。
public class State { private String name; private String capital; private int districts; private String languages; private String airports; private String placesToVisit; private String interestingFacts; State(String name,String capital,int districts,String languages,String airports,String placesToVisit,String interestingFacts){ this.name=name; this.capital=capital; this.districts=districts; this.languages=languages; this.airports=airports; this.placesToVisit=placesToVisit; this.interestingFacts=interestingFacts; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public String getAirports() { return airports; } public void setAirports(String airports) { this.airports = airports; } public String getCapital() { return capital; } public void setCapital(String capital) { this.capital = capital; } public String getLanguages() { return languages; } public void setLanguages(String languages) { this.languages = languages; } public int getDistricts() { return districts; } public void setDistricts(int districts) { this.districts = districts; } public String getPlacesToVisit() { return placesToVisit; } public void setPlacesToVisit(String placesToVisit) { this.placesToVisit = placesToVisit; } public String getInterestingFacts() { return interestingFacts; } public void setInterestingFacts(String interestingFacts) { this.interestingFacts = interestingFacts; } }
我們有一個實用程序類,該類具有一個Map <String,State> state_map,用于存儲狀態(tài)名稱為鍵的狀態(tài)信息。該實用程序類還具有l(wèi)oadData() ,其填充方法state_map。
public class Utility { Map<String, State> state_map; Utility() { state_map = new HashMap<String, State>(); } void loadData(){ State rajasthan=new State("Rajasthan","Jaipur",33,"Hindi, Rajasthani","Jaipur, Jodhpur, Udaipur","Ajmer, Udaipur, Jaipur","Rajasthan is famous for its marbles"); State punjab=new State("Punjab","Chandigarh",22,"Hindi, Punjabi","Amritsar","Amritsar, Ludhiana","Punjab is popular for its joyful punjabi people"); State mp=new State("Madhya Pradesh","Bhopal",51 ,"Hindi","Bhopal, Gwalior","Bhopal, Gwalior","Madhya Pradesh is well known for its wildlife and monuments"); State haryana=new State("Haryana","Chandigarh",21 ,"Hindi, Haryanvi","","Hisar, Rohtak, Fridabad","Haryana is popular for its haryanvi language"); State gujrat=new State("Gujrat","Gandhinagar",33 ,"Hindi, Gujrati","Ahmedabad, Vadodara, Gandhinagar","Ahmedabad, Vadodara","Gujrat is famous for its rich culture and dandiya nights"); state_map.put("Rajasthan", rajasthan); state_map.put("Punjab", punjab); state_map.put("Madhya Pradesh", mp); state_map.put("Haryana", haryana); state_map.put("Gujrat", gujrat); } State getState(String stateName) { State state = null; state = state_map.get(stateName); return state; } }
配置Web服務(wù)
由于在本例中為Apache Tomcat,因此將Web服務(wù)部署在Web容器中,因此我們必須在web.xml文件中配置Web服務(wù),如下所示。
<listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <servlet-name>xyz</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>xyz</servlet-name> <url-pattern>/discoverIndia</url-pattern> </servlet-mapping>
最后一種配置是必需的–在WEB-INF文件夾中創(chuàng)建一個文件sun-jaxws.xml,該文件定義了Service實現(xiàn)類。
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="WebServicImpl" implementation="net.mahtabalam.ws.CountryImpl" url-pattern="/discoverIndia" /> </endpoints>
請注意,您將需要額外的jax-ws庫才能在Tomcat下發(fā)布基于SOAP的Web服務(wù)。您可以從jax-ws.net下載這些庫 ,并將它們放在WEB-INF / lib文件夾中。
現(xiàn)在運行該項目,您的Web服務(wù)將被部署并可以在web.xml文件(在本例中為/ discoverIndia)中提到的任何URL下使用。
您可以通過在已部署的Web服務(wù)URL的末尾附加?wsdl來訪問WSDL(服務(wù)合同)。
發(fā)布Web服務(wù)后,您可以使用任何語言的Python,Perl,C#,Java等針對Web服務(wù)編寫客戶端。
這就是Web服務(wù)的美,它們獨立于語言。讓我們編寫一個Java客戶端來使用Web服務(wù)。
我們將使用JDK6附帶的 wsimport實用程序來生成客戶端構(gòu)件,以使其很容易針對discoverIndia Web服務(wù)編寫客戶端。
上面的命令將生成人工制品,我們將使用它們來編寫一個簡單的客戶端。
這是Client.java,它使用wsimport生成的類編寫一個簡單的Web服務(wù)客戶端。
package wsclient; public class Client { public static void main(String[] args) { CountryImplService service=new CountryImplService(); CountryImpl country=service.getCountryImplPort(); System.out.println("Capital of Kerala : "+country.getCapital("Kerala")); System.out.println("No. of districts in Telangna : "+country.getDistricts("Telangna")); System.out.println("Local languages of Gujrat : "+country.getLanguages("Gujrat")); System.out.println("Airports in Uttrakhand : "+country.getAirports("Uttrakhand")); System.out.println("Places to visit in Rajasthan : "+country.getPlacesToVisit("Rajasthan")); System.out.println("Interesting Facts about Meghalaya : "+country.getInterestingFacts("Meghalaya")); } }
現(xiàn)在編譯Client.java并運行它。
請記住,如果使用狀態(tài)名稱來調(diào)用Web服務(wù),而該狀態(tài)名稱未被Web服務(wù)處理,則將獲得SOAP Fault作為響應(yīng)。
獲取源代碼:如果您有興趣親自嘗試該代碼,可以從GitHub獲得它。
使用實時Web服務(wù): 此Web服務(wù)已在mathabalam.net上實時部署, 并且WSDL文件在此處可用。