WebService:CXF发布Web项目

l 由于 cxf web 项目已经集成了 Spring 所以, cxf 的服务类都是在 spring 的配置文件中完成的。以下是步骤:
l 第一步:建立一个 web 项目。
l 第二步:准备所有 jar 包。将 cxf_home \lib 项目下的所有 jar 全部 copy 到新项目的 lib 目录下,里面已经包含了 spring3.0 jar 包。
l 第三步:在 web.xml 中配置 cxf 的核心 servlet CXFServlet
l 第四步:创建 ( 最好是 Copy)cxf-servlet.xml 文件。这是一个 spring 的配置文件。


在web.xml中配置

<?xmlversion="1.0" encoding="UTF-8"?>

<web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <servlet>

  <!-- 配置cxf -->

  <servlet-name>cxf</servlet-name>

  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

  <init-param>

  <!-- 配置Spring的配置文件,默认就是这儿 -->

  <param-name>config-location</param-name>

  <param-value>/WEB-INF/cxf-servlet.xml</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

  <servlet-name>cxf</servlet-name>

  <url-pattern>/ws/*</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

  <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>



cxf-servlet.xm

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"

  xmlns:jaxrs="http://cxf.apache.org/jaxrs"xmlns:cxf="http://cxf.apache.org/core"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans.xsd

            http://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd

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

            http://cxf.apache.org/corehttp://cxf.apache.org/schemas/core.xsd">

  <!-- 引入CXFBean定义如下,早期的版本中使用,

导入的三个配置文件都在cxf.jarMETA文件夹中

-->

  <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"/>

  <!-- 直接发布一个类,无接口 -->

  <jaxws:endpointid="one" implementor="cn.itcast.ws1.OneService"

  address="/one">

  </jaxws:endpoint>

  <!-- 发布一个服务,没有指定接口 --

<!-- 声明方式说明:

        serviceClass:必须为一个接口,

                     并在接口上必须使用@WebService注解否则调用时会抛出异常

         serviceBean:是实际服务的类,必须是serviceClass的子类

                  此类上面即可以使用@WebService注解,也可以不使用

         address:访问地址,省去前面的ip:port.

             注意在此注册的类,必须要添加@WebService的注解

    -->


>

  <jaxws:serverid="two" address="/two" serviceClass="cn.itcast.ws2.ITwoService">

  <jaxws:serviceBean>

  <!-- 指定发布类,下面类必须添加@WebService注解 -->

  <beanclass="cn.itcast.ws2.TwoServiceImpl"></bean>

  </jaxws:serviceBean>

  </jaxws:server>

</beans>


l http://localhost:9999/cxf_spring/ws


CXFServlet

l CXFServlet 类,通过读取 config -location 的配置项读取 cxf-servlet.xml 配置文件。并在内部读取自己的配置文件 cxf.xml 文件。
l CXFServlet 读取配置文件后,将文件信息全部读取到 ApplicationContext Spring 类中。
以下是它的源代码:
WebService:CXF发布Web项目_第1张图片


添加 拦截器

<!-- 声明方式说明:

        serviceClass:必须为一个接口,

                   并在接口上必须使用@WebService注解否则调用时会抛出异常

       serviceBean:是实际服务的类,必须是serviceClass的子类

              此类上面即可以使用@WebService注解,也可以不使用

       address:访问地址,省去前面的ip:port.

           注意在此注册的类,必须要添加@WebService的注解

    -->

   <jaxws:server id="one"

            serviceClass="cn.one.IOneService"

            address="/one">

   <jaxws:inInterceptors>

   <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>

   </jaxws:inInterceptors>

   <jaxws:outInterceptors>

   <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>

   </jaxws:outInterceptors>

   <jaxws:serviceBean>

   <bean class="cn.one.OneService"></bean>

   </jaxws:serviceBean>

   </jaxws:server>



客户端调用

l 使用纯 Java 项目调用
1 、根据客户端生成的代码来调用。(优选这种方式)
请先生成然后在任意的 Java 项目中调用 。
2 、客户端只拥有一个接口,使用 JaxWsProxyFactoryBean 来调用。
因为以下使用了 JaxWsProxyFactoryBean , 所以,仍然需要 CXF 的环境,而使用此环境就会造成 Jar 文件的大量冗余,所以大家要谨慎选择。

JaxWsProxyFactoryBean client =

newJaxWsProxyFactoryBean();

client.setAddress("http://localhost:7777/xcxf2_web/ws/one");

client.setServiceClass(IOneService.class);

IOneService one = client.create(IOneService.class);

String ss = one.sayHi("OK你好");

System.err.println(ss);

Spring项目中,通过配置文件调用

新建立一个 Java 项目,并加载 cxf 的所有包。
只需要生成的接口文件。
classpath 下新建立一个 ClientBeans.xml 文件 .
优点与缺点:
此种情况,适合于一个 Javaweb 项目已经集成了 Spring 。并希望通过 CXF 配置的方式调用 Web 服务。
此种情况,仍然需要导入 CXF 的大量 jar 包。
这种情况也存在一定人优点,如可以将外部的 Web 服务通过配置文件注入 (DI) Action 类中。



1、说明:IHelloWorld.java是通过wsimport生成的接口,我们只需要这个接口。

2CxfJavaClient.java包含main方法,用于通过ClientBeans.xml文件,调用WebService

3、源代码:

package com.itcast.cxf.first;

import javax.jws.WebService;

/**

 * 如果没有改变包名的情况下,可以只使用@WebService注解。

 * 如果修改了包名则应该使用

 * @WebService(name="IHelloWorld",targetNamespace="http://wj.com")

 * 所以,对于此类,仍然建议使用wsimportwsdl2java生成。

 * (仅需要此接口,其他类,不需要)

 * @author wangjianme

 *

 */

@WebService

publicinterface IHelloWorld {

    public String sayHello(Stringname);

}


以下是ClientBeans.xml的文件的源代码:

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

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

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

       xsi:schemaLocation="http://www.springframework.org/schema/beans

            http://www.springframework.org/schema/beans/spring-beans.xsd

            http://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd

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

            http://cxf.apache.org/corehttp://cxf.apache.org/schemas/core.xsd">

  <jaxws:client    id="helloClient"

      address="http://127.0.0.1:9999/cxf2.4_spring_web/ws/helloworld"

       serviceClass="com.itcast.cxf.first.IHelloWorld">

  </jaxws:client>

</beans>

1、以下是CxfJavaClient.java的源代码:

package com.itcast.cxfweb.java.client;

import org.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

import com.itcast.cxf.first.IHelloWorld;

/**

 * Java项目的客户端

 * @author wangjianme

 */

publicclass CxfJavaClient {

  public static void main(String[] args) {

  //读取配置文件

  ApplicationContextctx =

  new ClassPathXmlApplicationContext("ClientBeans.xml");

  //get到接口类型并调用

  IHelloWorld hello =(IHelloWorld)ctx.getBean("helloClient");

  String str = hello.sayHello("WJ");

  System.err.println(str);

  }

}


你可能感兴趣的:(WebService:CXF发布Web项目)