zoukankan      html  css  js  c++  java
  • So easy Webservice 8.spring整合CXF 发布WS

    1.添加jar包(cxf的jar包中包含了spring的jar包),添加spring配置文件

    2.web.xml中配置CXFServlet,过滤WS服务的地址

    <!-- 配置CXFServlet,实现地址过滤的功能,项目启动时实例化 -->
    <servlet>
    <servlet-name>cxfServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>csfServlet</servlet-name>
    <!-- 访问 http://localhost:8080/工程名/ws/ 下的所有请求,都会交给当前servlet过滤 -->
    <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>

    <!-- 由于上面的url-pattern中配置了过滤路径,所有ws服务地址应配置为:http://localhost:8080/工程名/ws/xxxService -->

    3.配置applicationContext.xml


    3.1 web.xml中配置spring监听器,在项目启动时加载spring配置文件

    <!-- 配置监听器:加载spring配置文件 -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    3.2 添加ws服务实现类(必须添加注解@WebService),在spring中配置服务实现类的bean

    import java.util.ArrayList;
    import java.util.List;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    
    @WebService(
            serviceName="UserService",
            name="user",
            portName="UserServicePort",
            targetNamespace="com.mlxs.ws.cxfws.spring"
    )
    public class UserServiceImpl {
    
        private static List<User> ulist = new ArrayList<User>();
        
        @WebMethod(operationName="add")
        public void add(@WebParam(name="u") User u) {
            ulist.add(u);
        }
    
        @WebMethod(operationName="query")
        //@WebResult 如果是集合,指定的是集合中存放的对象名称
        public @WebResult(name="user") List<User> query() {
            return ulist;
        }
    
    }
    <bean id="userService" class="com.mlxs.ws.cxfws.spring.UserServiceImpl"/>

    3.3 添加jaxws标签
    在cxf.jar中,找到/schemas/jaxws.xsd,再查找命名空间:targetNamespace="http://cxf.apache.org/jaxws",将内容复制到spring文件中:

    xmlns:jaxws="http://cxf.apache.org/jaxws"

    再在xsi:schemaLocation中添加(别名 实际地址):

    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd


    3.4 配置CXF, 把服务实现类bean配置发布成WS服务 ;
    address="/user"中不用配置前缀,ws地址在web.xml中servlet的配置的:http://localhost:8080/工程名/ws/user;
    配置日志;

    <jaxws:server address="/user">
    <jaxws:serviceBean>
    <ref bean="userService"/>
    </jaxws:serviceBean>
    <!-- 配置日志 -->
    <jaxws:inInterceptors>
    <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
    </jaxws:inInterceptors>
    <jaxws:outInterceptors>
    <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    </jaxws:outInterceptors>
    </jaxws:server>


    4.部署到tomcat,启动服务,使用浏览器访问http://localhost:8080/webservice_cxf_server/ws/user?WSDL

    <wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="com.mlxs.ws.cxfws.spring" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService" targetNamespace="com.mlxs.ws.cxfws.spring">
    <wsdl:types>
    <xs:schema xmlns:tns="com.mlxs.ws.cxfws.spring" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="com.mlxs.ws.cxfws.spring" version="1.0">
    <xs:element name="add" type="tns:add"/>
    <xs:element name="addResponse" type="tns:addResponse"/>
    <xs:element name="query" type="tns:query"/>
    <xs:element name="queryResponse" type="tns:queryResponse"/>
    <xs:complexType name="query">
    <xs:sequence/>
    </xs:complexType>
    <xs:complexType name="queryResponse">
    <xs:sequence>
    <xs:element maxOccurs="unbounded" minOccurs="0" name="user" type="tns:user"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="user">
    <xs:sequence>
    <xs:element name="id" type="xs:int"/>
    <xs:element minOccurs="0" name="name" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="add">
    <xs:sequence>
    <xs:element minOccurs="0" name="u" type="tns:user"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="addResponse">
    <xs:sequence/>
    </xs:complexType>
    </xs:schema>
    </wsdl:types>
    <wsdl:message name="queryResponse">
    <wsdl:part element="tns:queryResponse" name="parameters"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="add">
    <wsdl:part element="tns:add" name="parameters"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="addResponse">
    <wsdl:part element="tns:addResponse" name="parameters"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="query">
    <wsdl:part element="tns:query" name="parameters"></wsdl:part>
    </wsdl:message>
    <wsdl:portType name="user">
    <wsdl:operation name="query">
    <wsdl:input message="tns:query" name="query"></wsdl:input>
    <wsdl:output message="tns:queryResponse" name="queryResponse"></wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="add">
    <wsdl:input message="tns:add" name="add"></wsdl:input>
    <wsdl:output message="tns:addResponse" name="addResponse"></wsdl:output>
    </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="UserServiceSoapBinding" type="tns:user">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="query">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="query">
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="queryResponse">
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="add">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="add">
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="addResponse">
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="UserService">
    <wsdl:port binding="tns:UserServiceSoapBinding" name="UserServicePort">
    <soap:address location="http://localhost:8080/webservice_cxf_server/ws/user"/>
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>

    5.使用myeclipse SOAP浏览器浏览:

    调用add服务接口添加数据:

    查看控制台:

    Address: http://localhost:8080/webservice_cxf_server/ws/user
    Encoding: UTF-8
    Http-Method: POST
    Content-Type: text/xml; charset=utf-8
    Headers: {Accept=[application/soap+xml, application/dime, multipart/related, text/*], cache-control=[no-cache], connection=[close], Content-Length=[371], content-type=[text/xml; charset=utf-8], host=[localhost:8080], pragma=[no-cache], SOAPAction=[""], user-agent=[IBM Web Services Explorer]}
    Payload: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="com.mlxs.ws.cxfws.spring" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
        <q0:add>
          <u>
            <id>1</id>
            <name>admin</name>
          </u>
        </q0:add>
      </soapenv:Body>
    </soapenv:Envelope>

    调用查询服务接口query:

    控制台:

    ----------------------------
    ID: 12
    Address: http://localhost:8080/webservice_cxf_server/ws/user
    Encoding: UTF-8
    Http-Method: POST
    Content-Type: text/xml; charset=utf-8
    Headers: {Accept=[application/soap+xml, application/dime, multipart/related, text/*], cache-control=[no-cache], connection=[close], Content-Length=[288], content-type=[text/xml; charset=utf-8], host=[localhost:8080], pragma=[no-cache], SOAPAction=[""], user-agent=[IBM Web Services Explorer]}
    Payload: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="com.mlxs.ws.cxfws.spring" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
        <q0:query/>
      </soapenv:Body>
    </soapenv:Envelope>
    
    --------------------------------------
    2016-1-28 23:38:35 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
    信息: Outbound Message
    ---------------------------
    ID: 12
    Encoding: UTF-8
    Content-Type: text/xml
    Headers: {}
    Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:queryResponse xmlns:ns2="com.mlxs.ws.cxfws.spring"><user><id>1</id><name>admin</name></user><user><id>2</id><name>魅力小生</name></user></ns2:queryResponse></soap:Body></soap:Envelope>
    --------------------------------------

    也可以自己写jsp或者java测试类进行ws服务接口的访问。。。

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    2013 年最不可思议的 10 个硬件开源项目
    三款SDR平台对比:HackRF,bladeRF和USRP
    形同虚设:花费700美元便可突破门禁
    oracle timestamp和date区别
    linux服务器性能——CPU、内存、流量、磁盘使用率的监控
    通过安装memadmin对memcache进行可视化管理
    SNMP MIBs and IPv6
    使用 cacti 监控 windows 服务器硬盘的 I/O 状况
    snmp对超过16T的磁盘大小识别不对的解决办法
    源码编译安装net-snmp
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5167788.html
Copyright © 2011-2022 走看看