webservice接口示例(spring+xfire+webservice)
CreateTime--2018年4月2日17:36:07
Author:Marydon
一、准备工作
1.1 jar包
springjar包,xfire jar包,webservicejar包
1.2 目录结构
二、代码设计
web.xml
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>demo_WebService</display-name> <!-- spring的核心配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-applicationContext.xml</param-value> </context-param> <!-- spring的监听器,用于在服务器开启的时会自动加载spring的配置文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- xfire的核心servlet,用于发布webservice服务 --> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class> <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> --> <!-- 用于标记容器是否在启动的时候就加载这个servlet --> <!-- 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 正数的值越小,启动该servlet的优先级越高。 如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <!-- 在这个URI下开放WebService服务,即该路径下的所有请求由XFireSpringServlet接管 --> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
spring-applicationContext.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" 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/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> <!--加载webservice 组件的配置--> <import resource="config/spring-webService.xml"/> </beans>
spring-webService.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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <!-- 引入XFire预配置信息 --> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" /> <!-- 接口业务实现 --> <bean id="servicTestImpl" class="webService.impl.ServiceTestImpl"> <!-- 这里可以配置数据层 --> <!-- <constructor-arg index="0" ref="daoVIRTUAL_CARD"/> --> </bean> <!-- java接口类的名称就是webservice的(访问该接口的)名称,无法自定义接口的名称 class-使用XFire导出器 --> <bean id="myFirstInterface" class="org.codehaus.xfire.spring.remoting.XFireExporter"> <!-- 引用xfire.xml中定义工厂 --> <property name="serviceFactory" ref="xfire.serviceFactory"/> <!-- 引用xfire.xml中定义的xfire实例 --> <property name="xfire" ref="xfire"/> <!-- 提供服务接口的实现类 --> <property name="serviceBean" ref="servicTestImpl" /> <!-- 提供服务的接口,这个接口是向客户端进行暴露,里面的方法都可以被客户端所访问 --> <property name="serviceClass" value="webService.IServiceTest"/> </bean> </beans>
IServiceTest.java
package webService; /** * webservice接口测试 * @author Marydon * @createTime 2018年3月9日上午9:32:11 * @updateTime * @Email:Marydon20170307@163.com * @version:1.0.0 */ public interface IServiceTest { /** * 获取用户信息 * @return */ public String getUserInfo(String xml); }
ServiceTestImpl.java
package webService.impl; import org.apache.commons.lang.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import webService.IServiceTest; /** * webservice接口测试实现类 * @author Marydon * @createTime 2018年3月9日上午9:38:09 * @updateTime * @Email:Marydon20170307@163.com * @version:1.0.0 */ public class ServiceTestImpl implements IServiceTest { @Override public String getUserInfo(String xml) { // 返回xml信息 String xmlResult = ""; try { // 1.解析xml,获取document对象 Document document = DocumentHelper.parseText(xml); System.out.println(document.asXML().toString()); // 获取参数id的值 String id = document.selectSingleNode("//userId").getText(); // 2.参数校验 if (!StringUtils.isEmpty(id)) { StringBuffer sb = new StringBuffer(); sb.append("<Response>"); // 姓名 sb.append("<userName>").append("Marydon").append("</userName>"); sb.append("<error_text>").append("成功").append("</error_text>"); sb.append("</Response>"); Document bodyDoc = DocumentHelper.parseText(sb.toString()); xmlResult = bodyDoc.getRootElement().asXML(); System.out.println(xmlResult); } else { // 返回错误信息 xmlResult = this.returnErrorXml("id为空!"); } System.out.println(xmlResult); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return xmlResult; } /** * 返回错误信息 * @param errorMsg * @return * @throws DocumentException */ private static String returnErrorXml(String errorMsg) throws DocumentException { // 返回xml信息 String xmlResult = ""; StringBuilder sb = new StringBuilder(); sb.append("<Response>"); sb.append("<error_text>").append(errorMsg).append("</error_text>"); sb.append("</Response>"); Document bodyDoc = DocumentHelper.parseText(sb.toString()); xmlResult = bodyDoc.getRootElement().asXML(); System.out.println("XML:" + xmlResult); return xmlResult; } }
三、测试阶段
1.是否接口是否发布成功:
在浏览器中打开上面的接口地址:http://127.0.0.1:8070/demo/services/IServiceTest?wsdl,
如果出现wsdl文档,则表示发布成功。
2.测试数据传输:
方法一:借助工具SoapUI
方法二:使用java借助xfire调用接口
相关推荐里↓↓↓有介绍。
四、总结
使用xfire发布webservice服务有两种方式:
1.使用org.codehaus.xfire.spring.XFireSpringServlet来管理webservice请求
使用这种方式,/services,即http://127.0.0.1:8070/demo_WebService/services
会显示出项目下所有的接口信息
另外,接口的名称和定义的Java接口名称一致,其访问路径就是:接口名称+"?wsdl"
并且,接口的访问路径无法自定义修改
2.使用org.springframework.web.servlet.DispatcherServlet来管理webservice请求
使用这种方式,/services,即http://127.0.0.1:8070/demo_WebService2/services
不会显示出项目下所有的接口信息
另外,接口的名称和设置该java接口类的bean注入的name属性的值相对应,name的值+"?wsdl"
修改name的值,就可以改变该接口所对应的访问路径
使用spring来管理webservice请求的例子也已经写好,加qq付费获取源码。