欢迎来到: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得到如下:
然后点击:{http://service.cxf.observer.com/}GradeService;出现webService的wsdl:
出现以上现象,恭喜你,你的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客户端的设计开发与应用