zoukankan      html  css  js  c++  java
  • webservice接口示例(spring+xfire+webservice)

    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付费获取源码。

  • 相关阅读:
    bladex从blade-dev.yaml 读取配置信息
    怎么判断map不为空
    根据来源编号对明细进行分组 跟库存做对比 用到的技术 list根据某个字段分组 Double Long 比较大小
    hibernate根据包名获取该包下实体类,数据库中不存在的库表名称
    hibernate NonUniqueObjectException 一个session中存有两个识别码(id)相同的对象
    正则匹配不包含某些字符 update(?!tdyt)[A-z(]*(qlgz)
    idea常用插件
    Rainbow Roads
    Jumping Haybales (dp)
    01背包
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/8696119.html
Copyright © 2011-2022 走看看