场景: 使用Apache CXF发布一个查询城市信息的服务,
查到信息是服务端写的一个JSON格式的静态数据,使用webservice的最简流程。
1.创建spring web项目,且确保web项目在Tomcat中能正常启动。
讲解:本例的项目名称是study,包名是 com.zbz.webservice
2.正确导入Apache CXF框架的jar包,本例使用的3.1.14版本
3.创建一个接口,本例只用一个方法.在com.zbz.webservice包下创建。
@WebService(targetNamespace = "http://webservice.zbz.com/")
public interface PublicInterface {
/**获取城市信息的方法,入参是城市名称*/
String getCityInfo(String name);
}
讲解:@WebService是一个发布webservice的注解
targetNamespace = "http://webservice.zbz.com/" 指定名称空间
名称空间是包名反过来。
4.创建一个类实现接口
在com.zbz.webservice.impl包下创建PublicInterfaceImpl实现类,
并且实现String getCityInfo(String name)方法
5.本例使用一个独立的webserviceConfig.xml文件作为配置文件,只配置Apache CXF相关信息。
存放目录: /study/WebRoot/WEB-INF/config/webservice/webserviceConfig.xml
<1>.在配置文件中配置PublicInterfaceImpl实现类的bean
<bean id="publicInterface" class="com.zbz.webservice.impl.PublicInterfaceImpl" />
<2>.通过jaxws:server方式来配置webservice
<jaxws:server serviceClass="com.zbz.webservice.PublicInterface" address="/publicService">
<jaxws:serviceBean>
<ref bean="publicInterface" />
</jaxws:serviceBean>
</jaxws:server>
讲解:com.zbz.webservice.PublicInterface是接口名
/publicService对外的访问地址要用
<ref bean="publicInterface" />就是实现类的bean
6.在web.xml文件中引入webserviceConfig.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/common/*.xml;/WEB-INF/config/webservice/*.xml</param-value>
</context-param>
讲解:/WEB-INF/config/common/*.xml;其它spring的配置
/WEB-INF/config/webservice/*.xml 就是Apache CXF
7.在web.xml文件中发布一个Apache CXF 的CXFServlet服务
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
讲解:这个一个常规servlet是一样的配置,只是需要引入的是Apache CXF框架中的一个jar包内的类。
<url-pattern>/ws/*</url-pattern> ,这是作为外部访问是的路径映射,即CXFServlet的服务都映射
在/ws/* 下。
8.访问路径: http://127.0.0.1:8080/study/ws/publicService?wsdl
讲解: http://127.0.0.1:8080 IP+端口
study 项目名称
/ws在web.xml中的配置映射路径
/publicService 在webserviceConfig.xml中的地址
wsdl 标准后缀
9.可以使用Storm这样的第三方工具测试,当然也可以自己用代码实现客户端。
10.上文提到类与配置文件
1>.接口
package com.zbz.webservice;
import javax.jws.WebService;
/**
* 对外发布服务接口,只需是一个普通java接口即可
* @ClassName: PublicInterface
* @date: 2018-12-29 下午8:34:46
*/
@WebService(targetNamespace = "http://webservice.zbz.com/")
public interface PublicInterface {
/**获取城市信息的方法,入参是城市名称*/
String getCityInfo(String name);
}
2>实现类
package com.zbz.webservice.impl;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zbz.webservice.PublicInterface;
/**
* 实现接口方法
* @ClassName: PublicInterfaceImpl
* @date: 2018-12-29 下午8:35:14
*/
public class PublicInterfaceImpl implements PublicInterface {
private static final Logger logger = LoggerFactory.getLogger(PublicInterfaceImpl.class);
@Override
public String getCityInfo(String name) {
/**1.入参简单判断*/
if(StringUtils.isBlank(name) || name == null){
return "传入参数不正确,请确认.";
}
String rtnMes = "本服务暂时不支持其它城市查询.";
/**2.具体逻辑,本例仅仅做个简单返回demo,传入参数是厦门,则返回厦门信息*/
if("厦门".equals(name)){
/**获取回厦门信息*/
rtnMes = getCityDetailXiamen();
}
return rtnMes;
}
public static String getCityDetailXiamen(){
String city = "{\n" +
" \"CITY_NAME\": \"厦门\", \n" +
" \"LAND_AREA\": 1699.39, \n" +
" \"POPULATION\": 401, \n" +
" \"GROSS\": 0, \n" +
" \"AREA_NUMBER\": \"350200\", \n" +
" \"POSTAL_CODE\": \"361000\", \n" +
" \"TELEPHONE_CODE\": \"0592\", \n" +
" \"CAR_CODE\": \"闽D\", \n" +
" \"DESCRIBE\": \"适合居住的城市.\"\n" +
"}";
return city;
}
}
3.webserviceConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaws="http://cxf.apache.org/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd" >
<bean id="publicInterface" class="com.zbz.webservice.impl.PublicInterfaceImpl" />
<!-- 通过jaxws:server方式来配置webservice -->
<jaxws:server serviceClass="com.zbz.webservice.PublicInterface" address="/publicService">
<jaxws:serviceBean>
<ref bean="publicInterface" />
</jaxws:serviceBean>
</jaxws:server>
</beans>
4.web.xml部分
<!-- 加载spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/common/*.xml;/WEB-INF/config/webservice/*.xml</param-value>
</context-param>
<!-- CXF方式发布webservice服务start -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<!-- CXF方式发布webservice服务end -->
以上,TKS.