利用cxf开发WebService
1.什么是CXF
Apache CXF =Celtix + Xfire
支持多种协议:
? SOAP1.1,1,2
? XML/HTTP
? CORBA(Common ObjectRequest Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)
? 并可以与Spring进行快速无缝的整合
? 灵活的部署:可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面。
2.安装CXF的其他支持项目
Ant
Tomcat
并设置以下环境变量:
? 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
注意:
1、为什么要用到ant这个工具呢?Ant做为一种工具已经广泛被使用,并且历史悠久。使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear),也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。由于ant是用xml语言写成的文件,并取默认名为build.xml文件。所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。
2、默认在Eclipse和MyEclipse的对ant有内建的支持。可以在MyEclipse中任意项目中建立一个文件叫build.xml文件,你会发现它有不同的图标(上面有个小蚂蚁)。
3. 用ANT来构造第一个CXF示例
在cxf_home\samples\java_first_pojo目录下启动服务器:
? 在命令行模式下进入上述目录:
? 执行 以下命令 ant server
在同一目录下打开新命令行窗口运行:
? ant client
注意:
1、java_frist_pojo是位于samples下的最简单的一个项目。
2、ant server,是通过ant来执行build.xml配置文件中的一段代码,就的工作就是编译Java类并启动服务。
3、ant client是访问服务。
4、让我们一块来看一下它的源代码。由三个类组成:接口HelloWorld,实现类HelloWorldImpl和服务发布类Server
在另一端则只有一个Client.java文件。
执行ant 是重新编译。
Ant server是启动服务。
Ant client是运行客户端。
Ant deploy –Dtomcat=true
4. 用ANT将它发布到Tomcat服务器上
1、执行ant clean清除以前生成的代码
2、执行ant war打包此应用。
3、执行ant deploy –Dtomcat=true将项目发布到tomcat的服务器上。
4、启动tomcat服务器
5、打开IE的地址栏输入:
http://localhost:9999/helloworld/services/hello_world?wsdl
或:http://localhost:9999/helloworld/services
6、在命令行执行:
? ant client-servlet –Dbase.url=http://localhost:9999
? 或在MyEclipse的WebServiceExplorer中访问这个WebService
7、停止tomcat服务器。
8、卸载应用:ant undeploy –Dtomcat=true
9、清空项目:ant clean
5. 在Eclipse中开发CXF的JavaSE应用
导入CXF中的 所有jar文件。可以通过WACH_JARS来观察各jar文件的用途。
注意:
1、记得调整你的jdk版本为jdk1.6.0_24.
2、将所有cxf的jar包拷贝到项目中来。添加到classpth中。
3、在开发之前可以先阅读CXF_HOME\lib\WATCH_JARS文件,分析jar文件之间的依赖关系
6.CXF发布服务的类
用两个不同的类发布应用:
ServerFactoryBean -- FacotryBean
JaxWsServerFactoryBean(建议使用此类)
7.服务与客户端类调用原则图解
8.使用ServerFactoryBean发布服务
使用ServerFactoryBean发布服务。
使用CXF发布一个服务,与JDK6发布一个服务完全不同
? * 即使是不使用@WebService注解,一样可以发布成功
? * 即使此类没有对外公布的方法一样可以发布成功
9.使用ClientProxyFactoryBean客户端调用
使用ServerFactoryBean发布服务以后,在没有接口的情况下,可以使用wsimport生成的客户端代码调用成功。
但如果要使用ClientProxyFactoryBean客户端去调用服务器,则必须要先在服务器端创建一个接口。(一直以来,Spring都要求面向接口编程,而cxf与Spring能很好的整合,也就在此。),所以,必须要重写服务器端的代码。这将导致刚才使用wsimport生成的调用代码失效。
同时,ClientProxyFactoryBean由于要用到CXF环境,所以要导入CXF的所有包。
同时,如果是在本项目中调用,则可以直接使用本项目的接口。
如果在其他项目中调用,仍然需wsimport生成的类,但只需要一个接口。
10.使用JaxWsServerFactoryBean发布服务: (建议使用此类)
JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
但在CXF的API文档中没有提供此类API,请通过查看源代码的方式获取此类的帮助。
此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。
使用此类生成的wsdl文件更加规范。
11.使用CXF的类发布一个服务
创建成功以后,使用Wsimport生成的客户端代码,同样可以调用成功
在使用CXF发布服务时,需要首先写一个接口,用以声明服务类型。这有点类似于Spring中的服务层的实现
12.使用JaxWsProxyFactoryBean客户端调用
此调用过程与ClientProxyFactoryBean的要求一样,也必须要拥有一个接口。
此时,仍然可以使用wsimport生成接口,在其他项目的调用。
在另一个项目中调用:
13.wsdl2java生成客户代码
在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。
此工具位于cxf_home/bin目录下。参数与wsimport有所不同。
它包含以下参数:
? -d参数,指定代码生成的目录。
? -p参数,指定生成的新的包结构。
需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。
在命令行执行:
wsdl2java –d .http://127.0.0.1:6666/helloworld?wsdl
调用端代码:
14.给服务添加消息拦截器
LoggingInInterceptor– 信息输入时的拦截器 –请求
LoggingOutInterceptor–信息输出时的拦截器-响应
给服务器添加拦截器,类似于使用TCP/IP Monitor来捕获SOAP消息的过程。
15.使用JavaScript也可以访问WebServie
jQuery访问WebService.
? 1、在本域准备jquery.js(由于jquery对跨域的请求做了限制,所以jquery仅限于在本域中使用。但为了快速解析XML文件,仍然可以使用jquery当成解析xml文件的工具。)。
? 2、通过js发起ajax请求。