码迷,mamicode.com
首页 > 编程语言 > 详细

【Java EE 学习第81天】【CXF框架】【CXF整合Spring】

时间:2016-01-01 20:53:15      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

一、CXF简介

  CXF是Apache公司下的项目,CXF=Celtix+Xfire;它支持soap1.1、soap1.2,而且能够和spring进行快速无缝整合。

  另外jax-ws是Sun公司发布的一套开发WebService服务的标准。早期的标准如jax-rpc已经很少使用,而cxf就是在新标准jax-ws下开发出来的WebService,jax-ws也内置到了jdk1.6当中。

  CXF官方下载地址:http://cxf.apache.org/download.html

  下载完成之后,解压开压缩文件,可以发现有一个samples文件夹,在该文件夹中给出了非常多的例子用于研究CXF的使用方法。在CXF2.4.0中提供了Ant的配置运行方法,所以如果想要快速运行示例程序,就需要安装Ant环境,当然Tomcat环境、CXF环境肯定也是必不可少的。

  Ant、Tomcat都是Apache公司的项目:

  Ant下载地址:http://ant.apache.org/

  设置环境变量:

JAVA_HOME  
CXF_HOME
ANT_HOME
CATALINA_HOME
Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin
CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar;.\build\classes

  使用Ant运行第一个CXF示例(以2.4.0为例),打开samples/java_first_pojo文件夹,并在该文件夹中打开两个命令行窗口,分别输入

ant server

  和

ant client

  即可将示例运行起来,并看到服务端和客户端的控制台打印结果;但是注意jdk版本问题,最好使用jdk1.6,在jdk1.8的环境下运行不起来,jdk1.7没试过。

二、Java SE下构建CXF的应用

  1.准备工作:将lib文件夹下所有的jar包都拷贝到工程中,并添加到classpath,jar包有很多,里面包括了以后需要的springjar包。

  2.拷贝完jar包之后就能够进行测试了,CXF发布WebService服务的方式有两种,一种是“简单服务发布”,另外一种是“复杂服务发布”

    (1)简单服务发布

    使用ServerFactoryBean类实现,该类是核心类。

 1 package com.kdyzm.cxf.ws.server;
 2 
 3 import org.apache.cxf.frontend.ServerFactoryBean;
 4 
 5 public class CXFOneServer {
 6     public String sayHello(String hello){
 7         System.out.println("接收到了请求的参数:"+hello);
 8         return hello;
 9     }
10     public static void main(String[] args) {
11         ServerFactoryBean bean=new ServerFactoryBean();
12         bean.setAddress("http://localhost:9090/hello");
13         //设置服务接口,如果没有接口,则为服务类
14         bean.setServiceClass(CXFOneServer.class);
15         //设置服务实现类
16         bean.setServiceBean(new CXFOneServer());
17         bean.create();
18         System.out.println("服务发布成功!");
19     }
20 }

    使用该类的特点就是:

      *  服务类可以不使用@WebService注解

      *  就算该服务类没有提供对外服务的方法,该服务也能够发布成功

    可以看出来在CXF环境下发布服务和在JDK环境下发布服务的特点是截然不同的。

    (2)复杂服务发布(推荐使用的服务发布方式)

    复杂服务发布使用的核心类是JaxWsServerFactoryBean类,该类是ServerFactoryBean类的子类,同时也是功能扩展类,推荐使用该类发布服务,因为使用该类发布的服务生成的wsdsl文件更加规范。

 1 package com.kdyzm.cxf.ws.server;
 2 
 3 import javax.jws.WebService;
 4 import javax.xml.ws.BindingType;
 5 import javax.xml.ws.soap.SOAPBinding;
 6 
 7 import org.apache.cxf.interceptor.LoggingInInterceptor;
 8 import org.apache.cxf.interceptor.LoggingOutInterceptor;
 9 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
10 
11 /**
12  * 发布服务的第二种方法,这种方式必须加上WebService注解,否则服务类中的方法不能暴露出来
13  * @author kdyzm
14  *最好使用SOAP1.2,这样就算是SOAP1.1的客户端也能够正常访问服务
15  */
16 @WebService
17 @BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
18 public class CXFTwoServer {
19     public String sayHello(String hello){
20         System.out.println("获取请求参数:"+hello);
21         return hello;
22     }
23     public String calculate(int input){
24         return input*input+"";
25     }
26     public static void main(String[] args) {
27         JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
28         bean.setAddress("http://localhost:9000/helloworld");
29         bean.setServiceClass(CXFTwoServer.class);
30         bean.setServiceBean(new CXFTwoServer());
31         //加上日志选项,能够清楚的查看到请求和相应的代码。
32         bean.getInInterceptors().add(new LoggingInInterceptor());
33         bean.getOutInterceptors().add(new LoggingOutInterceptor());
34         bean.create();
35         System.out.println("第二种方式服务发布成功!");
36     }
37 }

    使用JaxWsServerFactoryBean类发布服务的方式的特点是:

    *  服务类必须使用@WebService注解,虽然不加上该注解也不会报错,但是服务类中的所有服务方法都不会暴露出来(wsdl文件中找不到对应的方法),这样实际上该服务类就没有什么作用了。

    *  该类和ServerFactoryBean类相同,就算没有对外暴露服务方法,也能够将服务发布成功。

  3.说明

    (1)可以使用相关注解对服务类进行说明,强烈建议使用注解@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)将服务声明为符合SOAP1.2规范的服务。

    (2)通过加上一下两句代码可以对请求和响应的过程进行监听,这样就能够非常清楚的查看请求头信息、请求体信息、响应头信息和响应体信息了。

bean.getInInterceptors().add(new LoggingInInterceptor());
bean.getOutInterceptors().add(new LoggingOutInterceptor());

    技术分享

    (3)使用CXF发布的服务可以通过wsimport命令生成调用代码,其实这种事情不需要赘述,毕竟webService最大的卖点就是这点。

      但是需要注意的是,wsimport命令只识别SOAP1.1,所以如果服务是SOAP1.2的,那么使用wsimport命令就不管用了。解决方法就是使用CXF框架提供的

      wsdl2java命令,该命令的功能和wsimport命令相似,但是比wsimport命令的功能更加强大,它支持SOAP1.2。

      使用方式:

      wsdl2java 
            -d 参数,指定代码生成的目录
            -p 参数,指定生成的新的包结构。   

      使用方式举例:

      wsdlwjava -d . -p com.kdyzm.ws.cxf.server http://localhost:9090/ws?wsdl    

三、CXF整合Spring

  现在是明白了,啥啥都要和sprig整合,hibernate可以不用,因为有很多类似的框架能够使用,比如mybatis;struts2框架也可以不用,但是唯独这spring是必须要使用的。由此可见spring的地位是多么重要了。

  jar包和之前的相同,将/lib目录下的所有jar包都拷贝到WEB-INF/lib文件夹下就可以了。整合步骤:

  第一步:配置web.xml配置文件

<servlet>
    <servlet-name>cxf</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>cxf</servlet-name>
    <url-pattern>/cxf/*</url-pattern>
</servlet-mapping>

  注意黑色背景部分的代码,拦截规则就是这样,之后的spring配置文件中配置的"address"属性部分是/cxf/后面的部分,而不是全部,这点是需要特别注意的。

  第二步:配置cxf配置文件

  该cxf配置文件实际上就是spring的配置文件。

 

 

 

 

 

 

    

 

【Java EE 学习第81天】【CXF框架】【CXF整合Spring】

标签:

原文地址:http://www.cnblogs.com/kuangdaoyizhimei/p/5093628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!