欢迎来到:http://observer.blog.51cto.com

一:webService背景
   webservcie是可以跨语言跨平台开发的一种技术,各种计算机语言都可以搭建服务器,同时各种计算机语言也可以开发客户端。只要有服务器,不管是用java还是C++抑或是php搭建的,其他语言都可以根据其开放的wsdl开发好客户端,然后调用其方法就像调用本地本项目的方法一样。

   说到webService,就涉及到XML还有wsdl。
   简单的说,wsdl就是xml的一个标准,他标准着xml应该怎样写,才能够让我的程序使用,他们的关系就像java中的接口与实现接口的类一样(当然有不一样的,不要钻牛角尖了),打个比喻,我拥有这个wsdl的引用,你的xml必须实现我的wsdl上的东西,我才能够识别并使用你的xml。
   wsdl跟xml涉及太多,在此就不再多说了(也许以后会写些东西,但现在不谈),有兴趣的朋友可以上网搜一下有关文章跟视频,就算你不懂wsdl跟xml,但是搭建webServcie还是可以的。
   搭建webService的方式有很多,使用jdk自带的API都可以做到,有兴趣的朋友可以查看文章:http://duyunfei.iteye.com/blog/1110560
   使用jdk自带的利与弊我就不多说了,毕竟他的存在就有他存在的理由。
   好了进入正题,使用现在比较流行的CXF框架搭建webService。
   使用框架,我有两种方式,一种是使用现在越来越流行的maven工具,一种当然就是下载jar包,然后导进去搭建。在此两种方式一并奉上。
二:maven搭建webService
第一步:当然是搭建maven开发环境与用maven新建web项目了,我的项目名为:webServiceCXF,但是这个太多,在此不多说,想要在此学习maven的朋友可能要失望了,也许以后会写点东西介绍下吧!
第二步新建好项目之后引入相关包
   在项目的pom.xml文件中的<dependencies>标签中加入cxf的jar包配置,我的配置如下:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>3.1.1.RELEASE</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>
    <!-- spring starts -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.10</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>2.1_3</version>
    </dependency>
    <!-- spring ends -->
    <!-- cxf starts -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-bundle</artifactId>
        <version>2.5.0</version>
        <!-- 此包在整合spring跟hibernate时出现包冲突,在此去掉 -->
        <exclusions>
            <exclusion>
                <groupId>asm</groupId>
                <artifactId>asm</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- cxf ends -->
</dependencies>

   在此也许会有人会问,为什么还要加上spring的包?一,cxf框架依赖于spring。二,maven会自动导进依赖,但是在给cxf导进spring依赖时,我这里却只导进了一些依赖标准文件,实际没有导进jar包,所以必须加上去,也许有些朋友的maven版本或者导进的cxf包版本不一样,产生的效果会不一样也说不定。

第三步配置web.xml
   在src——>main——>webspp——>WEB-INF中的web.xml中加上cxf的servlet跟cxf的全局变量与cxf的配置文件,我的web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd"
    metadata-complete="true">
    <display-name>myserviceCXF</display-name>
    <!-- cxf全局变量 -->
    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>limg.cxf.example</param-value>
    </context-param>
    <!-- cxf配置文件位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/cxf.xml</param-value>
    </context-param>
    <!-- cxf servlet starts -->
    <servlet>
        <description>Apache CXF Endpoint</description>
        <display-name>cxf</display-name>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <!-- cxf servlet end -->
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

第四步定义接口
   我的接口如下:

package com.observer.cxf.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(targetNamespace="http://www.observer.com/service",serviceName="GradeService")
public interface GradeService {
    @WebMethod(operationName="getGradeName")
    @WebResult(name = "result")
    public String getGradeName(@WebParam(name = "toid")long toid);
}

   以上配置中,加上去的标签是用于webService生成wsdl用的,定义方法名,service名等,这里值得注意的是targetNamespace的值,要是没有他,那么系统会默认为你的包名,如果是这样,那么你对外开放方法之后,在wsdl中和客户端中都会暴露你的服务器的包路径,这个就危险了,所以强烈建议改成自己所希望显示的。在此,各位朋友大可以自己动手试试。
第五步定义实现类
   我的实现类定义如下:

package com.observer.cxf.service;
import javax.jws.WebService;
@WebService(endpointInterface = "com.observer.cxf.service.GradeService")
public class GradeServiceImpl implements GradeService {
    public String gradeName(long toid) {
        return "is succeed";
    }
}

   以上配置endpointInterface中的字符串为自己定义的webservice接口。
第六步配置cxf.xml文件
   在maven管理中,配置文件放在了src/main/resources中,如果没有这个文件夹,自己创建即可。在此文件夹下新建文件:cxf.xml,其中我的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schemas/jaxws.xsd
    ">
                                                                                                                                                                                                                      
    <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" />
    <bean name="gradeService" class="com.observer.cxf.service.GradeServiceImpl"/>
    <jaxws:server id="services" serviceClass="com.observer.cxf.service.GradeService" address="/Service">
        <jaxws:serviceBean>
            <ref bean="gradeService"/>
        </jaxws:serviceBean>
    </jaxws:server>
    <!-- <jaxws:server id="services" serviceClass="com.observer.cxf.service.GradeService" address="/Service">
        <jaxws:serviceBean>
            <bean class="com.observer.cxf.service.GradeServiceImpl"/>
        </jaxws:serviceBean>
    </jaxws:server> -->
</beans>

   以上配置,一种为另外定义一个bean,然后放进去,一种是直接在server中放进去,个人所需,自己选择吧!在此,如果另外定义了bean,比如说:使用spring的注释定义了一个class bean,那么就可以直接使用第一种方式加进去就可以了。
第七步:部署与测试
   启动tomcat,然后将你的项目部署上去,访问web下定义的servlet,比如说我的访问:http://localhost:8080/webServiceCXF/services得到如下:

200832950.png

   然后点击:{http://service.cxf.observer.com/}GradeService;出现webService的wsdl:

200855823.png
   出现以上现象,恭喜你,你的CXF框架webService服务器已经搭建成功。
   我的源码可以到此下载:webServiceCXFmaven.rar

三:下载jar包导进去搭建
第一步:下载jar包,新建项目
   如果不想自己找,到这里下载我的吧(我这里是linux系统,不过jar包是一样的):apache-cxf-2.6.1.tar

   新建web项目:webServiceCXF
   将cxf的apache-cxf-2.6.1.tar.gz包解压,将下面的lib目录下的jar包复制到webServiceCXF项目下的lib目录下,然后刷新,导进去,有一些myeclipse会自动导进去,自己灵活应用吧。
第二步:配置web.xml文件
   在WebRoot——>WEB-INF中的web.xml中加上cxf的servlet、cxf的全局变量与cxf的配置文件,我的web.xml配置与以上“maven搭建webService”的第三步中web.xml是一样的,自行到上面观看。
第三步:定义接口与定义实现类,这个跟“maven搭建webService”,一样,自行到上面观看。
第四步:配置cxf.xml文件
   在普通的web项目中,配置文件放在源代码的src目录下,在该目录下新建一个cxf.xml文件,cxf.xml的配置跟“maven搭建webService”的第六步中的cxf.xml配置一样,自行到上面观看。
第五步:部署与测试
   同样,这一步同样跟“maven搭建webService”的第七步中一样。
   此源码可以到这里来下载:webServiceCXFjar.rar

   到此,CXF搭建webService服务器的介绍已经完毕,下面还有使用CXF制作客户端可以参考文章:java中webservcie客户端的设计开发与应用js的webservice客户端的设计开发与应用