首先是服务器端:
//实体类 public class Weather { private String region;//区域编码 private String regionName;//区域名称 private float temperature;//温度 private boolean isRain;//是否下雨 public Weather() { super(); } public Weather(String region, String regionName, float temperature, boolean isRain) { super(); this.region = region; this.regionName = regionName; this.temperature = temperature; this.isRain = isRain; } public String getRegion() { return region; } public void setRegion(String region) { this.region = region; } public String getRegionName() { return regionName; } public void setRegionName(String regionName) { this.regionName = regionName; } public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } public boolean isRain() { return isRain; } public void setRain(boolean isRain) { this.isRain = isRain; } @Override public String toString() { return "Weather [region=" + region + ", regionName=" + regionName + ", temperature=" + temperature + ", isRain=" + isRain + "]"; } }
//SEI @WebService public interface WeatherDao { //通过区域编码查找该地区天气情况 @WebMethod Weather findWeatherByRegion(String region); }
//SEI实现类 @WebService public class WeatherService implements WeatherDao { @Override public Weather findWeatherByRegion(String region) { return new Weather("fjxm", "福建省厦门市", 20, true); } }
//配置beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- cxf的一些核心配置(必须引入) --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- implementor:SEI实现类全类名 --> <!-- address:名字可以任意取; webService部署路径:主机名/工程名/address wsdl文档:通过主机名/工程名/address?wsdl 不再需要手动去发布webService! --> <jaxws:endpoint id="weatherWS" implementor="com.cxf.service.WeatherService" address="/weatherws" /> </beans>
//配置web.xml,spring文件随容器启动加载 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>cxf_spring_webService_server</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置beans.xml --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <display-name>CXF Servlet</display-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
//发布该工程,查看wsdl文档: <?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://service.cxf.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://dao.cxf.com/" name="WeatherServiceService" targetNamespace="http://service.cxf.com/"> <wsdl:import location="http://localhost:8080/cxf_spring_webService_server/weatherws?wsdl=WeatherDao.wsdl" namespace="http://dao.cxf.com/"> </wsdl:import> <wsdl:binding name="WeatherServiceServiceSoapBinding" type="ns1:WeatherDao"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="findWeatherByRegion"> <soap:operation soapAction="" style="document"/> <wsdl:input name="findWeatherByRegion"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="findWeatherByRegionResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="WeatherServiceService"> <wsdl:port binding="tns:WeatherServiceServiceSoapBinding" name="WeatherServicePort"> <soap:address location="http://localhost:8080/cxf_spring_webService_server/weatherws"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
************至此,服务器端发布成功,接下来是客户端生成代码以及配置和测试****************
//配置客户端的client-beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- serviceClass:SEI --> <!-- address:server端webService的发布地址 --> <jaxws:client id="weatherClient" serviceClass="com.cxf.dao.WeatherDao" address="http://localhost:8080/cxf_spring_webService_server/weatherws" /> </beans>
//生成客户端代码同cxf生成客户端代码步骤---略 //测试 public class Test { public static void main(String[] args) { //获取spring容器,自动创建WeatherDao实现类对象 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml"); //client-beans.xml里的id WeatherDao weatherDao = (WeatherDao) context.getBean("weatherClient"); Weather weather = weatherDao.findWeatherByRegion("fjxm"); System.out.println(weather); } }
执行结果:
Weather [rain=true, region=fjxm, regionName=福建省厦门市, temperature=20.0]