发布于:2021-01-11 10:24:19
0
165
0
本文介绍了如何使用JAX-WS API创建基于SOAP的Web服务并将其与Tomcat一起部署。本教程遵循使用Java的wsimport实用程序逐步编写客户端的方法。
本文中显示的Web服务已在此处实时部署。
有多种创建Web服务的方法。在本文中,我们将使用JAX-WS创建基于SOAP的Web服务,该服务是XML Web Services的Java API,并将其部署在Tomcat下。
要记住的重要一点是,可以使用JAX-WS构建SOAP和REST样式的Web服务。有一个常见的误解,即JAX-WS用于创建基于SOAP的Web服务,而JAX-RS用于创建REST风格的Web服务。
JAX-WS API非常丰富,并提供了一些注释,使开发人员的工作变得轻松。
不同样式的基于SOAP的Web服务
基于SOAP的Web服务可以归类为
RPC样式– RPC样式用于创建包括简单数据类型(内置类型)的SOAP Web服务。
文档样式–这是默认样式,用于创建包含复杂数据类型的SOAP Web服务
DiscoverIndia Web服务
我们将创建一个名为DiscoverIndia的基于SOAP的Web服务。该网络服务的全部意义是,您将印度州的名称传递给该服务,然后您可以检索
该州的首都
该州的区数
该州的当地语言
该州的机场
在该州参观的地方
关于国家的一些有趣的事实
在开始实施之前,让我们了解基于SOAP的Web服务的体系结构。
因此,事不宜迟,让我们开始使用代码。
实施网络服务
这是该服务的服务端点接口(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是服务实现Bean(SIB),用于实现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类的成员,该类将状态信息存储在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,用于存储状态名称为键的状态信息。该实用程序类还具有loadData() ,其填充方法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服务
由于在本例中为Apache Tomcat,因此将Web服务部署在Web容器中,因此我们必须在web.xml文件中配置Web服务,如下所示。
<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文件夹中创建一个文件sun-jaxws.xml,该文件定义了Service实现类。
<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下发布基于SOAP的Web服务。您可以从jax-ws.net下载这些库 ,并将它们放在WEB-INF / lib文件夹中。
现在运行该项目,您的Web服务将被部署并可以在web.xml文件(在本例中为/ discoverIndia)中提到的任何URL下使用。
您可以通过在已部署的Web服务URL的末尾附加?wsdl来访问WSDL(服务合同)。
发布Web服务后,您可以使用任何语言的Python,Perl,C#,Java等针对Web服务编写客户端。
这就是Web服务的美,它们独立于语言。让我们编写一个Java客户端来使用Web服务。
我们将使用JDK6附带的 wsimport实用程序来生成客户端构件,以使其很容易针对discoverIndia Web服务编写客户端。
上面的命令将生成人工制品,我们将使用它们来编写一个简单的客户端。
这是Client.java,它使用wsimport生成的类编写一个简单的Web服务客户端。
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")); } }
现在编译Client.java并运行它。
请记住,如果使用状态名称来调用Web服务,而该状态名称未被Web服务处理,则将获得SOAP Fault作为响应。
获取源代码:如果您有兴趣亲自尝试该代码,可以从GitHub获得它。
使用实时Web服务: 此Web服务已在mathabalam.net上实时部署, 并且WSDL文件在此处可用。
作者介绍