• 1. 基于CXF的WebService王健北京传智播客教育 www.itcast.cn
  • 2. 什么是CXFApache CXF = Celtix + Xfire 支持多种协议: SOAP1.1,1,2 XML/HTTP CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#) 并可以与Spring进行快速无缝的整合 灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置web服务器),IBMWebSphera,BeaWebLogic上面。北京传智播客教育 www.itcast.cn
  • 3. 什么是CXF:北京传智播客教育 www.itcast.cn
  • 4. CXF的安装及配置北京传智播客教育 www.itcast.cn
  • 5. CXF的结构:北京传智播客教育 www.itcast.cn
  • 6. 下载完成后将其解压到某个目录下:北京传智播客教育 www.itcast.cn
  • 7. 安装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北京传智播客教育 www.itcast.cn
  • 8. 用ANT来构造第一个CXF示例:在cxf_home\samples\java_first_pojo目录下启动服务器: 在命令行模式下进入上述目录: 执行 以下命令 ant server 在同一目录下打开新命令行窗口运行: ant client 上面的代码,其实就是通过ant工具对源代码进行编译和运行。 如果能编译通过,将会显示build success.北京传智播客教育 www.itcast.cn
  • 9. 查看它的源代码并修改运行:北京传智播客教育 www.itcast.cn
  • 10. 用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北京传智播客教育 www.itcast.cn
  • 11. 在Eclipse中开发CXF的JavaSE应用:导入CXF中的jar文件,见右图:可以通过WACH_JARS来观察各jar文件的用途。 右图jar文件,请从CXF项目中查找。Java项目服务器端最少依赖的包:jetty也是一个web容器,它的特点是可以内嵌 到其他程序中,CXF就是的JavaSe发布,就是用 jetty做为服务器的,这要区分与Jdk1.6使用 socket的方式。 如果是发布到Tomcat服务器运行则不需要这些包文件。注意:上面的包中并没有依赖于Spring北京传智播客教育 www.itcast.cn
  • 12. CXF发布服务的类:JaxWsServerFactoryBean JaxWsServerFactoryBean用于发布一个服务,可以通过默认构造实例此类。 它的方法如下: setServiceBean(Object) – 设置一个服务对象 - * setAddress(String url) – 绑定一个地址和端口 - * create() - 在JavaSE环境下,使用jetty发布WebService. - * 以下是可选方法 : setServiceClass(Class cls) – 设置服务对象实现的接口类。 JaxRsServerFactoryBean 此类用于发布RESTful风格的webService. RESTful风格是以普通get,post请求为标准的,并可以请求和响应json数据。 CXF发布服务的类,其实是有两个,另一个是ServerFactoryBean它是JaxWsServerFactoryBean的父类。 北京传智播客教育 www.itcast.cn
  • 13. 使用JaxWsServerFactoryBean发布服务:JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。 但在CXF的API文档中没有提供此类API,请通过查看源代码的方式获取此类的帮助。 此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不 出错,但也不会对外暴露任何方法。 使用此类生成的wsdl文件更加规范。 以下是从它的源代码中找到的对此类的说明。北京传智播客教育 www.itcast.cn
  • 14. 使用JaxWsServerFactory发布一个服务:在服务启动成功后,访问的方式为:http://localhost:4444/one?wsdl创建成功以后,使用 Wsimport生成的客户 端代码,同样可以调用 成功(此类问题以后 不再赘述)。北京传智播客教育 www.itcast.cn
  • 15. 使用JaxWsProxyFactoryBean客户端调用此调用过程与ClientProxyFactoryBean的要求一样,也必须要拥有一个接口。且接口应该由wsimport生成。 此时,仍然可以使用wsimport生成接口,在其他项目的调用。在另一个项目中调用:北京传智播客教育 www.itcast.cn
  • 16. 规范的做法应该是先书写一个接口,如下:如果不是使用spring的 配置文件发布,可以 没有接口文件,但在 任何情况下建议拥有接 口文件。 如果使用spring的配置 文件发布,则必须要 拥有接口类。北京传智播客教育 www.itcast.cn
  • 17. wsdl2java生成客户代码:在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。 先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。 此工具位于cxf_home/bin目录下。参数与wsimport有所不同。 它包含以下参数: -d参数,指定代码生成的目录。 -p参数,指定生成的新的包结构。 需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。 在命令行执行: wsdl2java –d . http://127.0.0.1:6666/helloworld?wsdl请使用wsimport和wsdl2java生成的客户端代码分别调用-你会发现 没有任何区别!北京传智播客教育 www.itcast.cn
  • 18. 给服务添加拦消息拦截器:-这个对于获取请求的详细信息非常有用:LoggingInInterceptor – 信息输入时的拦截器 –请求 LoggingOutInterceptor –信息输出时的拦截器-响应server.getInInterceptors().add(new LoggingInInterceptor()); server.getOutInterceptors().add(new LoggingOutInterceptor());给服务器添加拦截器, 类似于使用TCP/IP Monitor 来捕获SOAP消息的过程。北京传智播客教育 www.itcast.cn
  • 19. 使用本JavaScript也可以访问WebServie:jQuery访问WebService. 1、在本域准备jquery.js (由于jquery对跨域的请求做了限制,所以jquery仅限于在本域中使用。但为了快速解析XML文件,仍然可以使用jquery当成解析xml文件的工具。)。 2、通过js发起ajax请求。北京传智播客教育 www.itcast.cn
  • 20. 使用Ajax-XHR对象跨域请求WebService: 右图代码为调用查询手机号归属地的ajax请求:北京传智播客教育 www.itcast.cn
  • 21. 在本域使用jquery访问: --查询所有用户:北京传智播客教育 www.itcast.cn
  • 22. 使用HttpUrlConnection调用WebService北京传智播客教育 www.itcast.cn
  • 23. 总结:如何通过ant发布第一个cxf应用。 手工建立一个java项目发布cxf的ws. 访问WebService的方法:这是关键 1:通过wsdl2java或是通过wsimport生成本地代码。 2:使用ajax发送soap协议请求webservice. 3:使用urlConnection发送soap协议请求webService.北京传智播客教育 www.itcast.cn
  • 24. NEW – 创建基于RESTful类型的webServiceRESTful是基于jax-rs的WebService.它即支持XML也支持JSON. JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services的简写,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。 JAX-RS提供了一些标注将一个资源类,一个POJOJava类,封装为Web资源。标注包括: @Path,标注资源类或者方法的相对路径 @GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。 @Produces,标注返回的MIME媒体类型 @Consumes,标注可接受请求的MIME媒体类型 @PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。北京传智播客教育 www.itcast.cn
  • 25. 在Java项目下发布一个RESTful的webService包括以下步骤:第一步:添加jsr311.jar(支持JSR)文件 和jettison-1.3.jar(解析JSON)。此文件是jdk1.6提供的新支持包。支持json格式的WebService. 必须。 第二步:必须 - 创建一个JavaBean.并添加@XmlRootElement注解。 第三步:必须 - 创建一个服务类,并使用@Path等注解进行标注。 第四步:使用JaxRsServerFactoryBean发布WebService. 必须。 可以给JaxRsServerFactoryBean添加消息拦截器 – 可选。 发布成功以后,可以输入以下地址访问XML描述文件,注意此描述文件不能生成本地代码。 http://localhost:9005/users?_wadl&_type=xml 注意上面的参数是:_wadl 而不是wsdl 第五步:客户端使用HttpClient进行调用。 第六步:或是客户端使用Ajax调用。北京传智播客教育 www.itcast.cn
  • 26. 使用JaxRsServerFactoryBean发布RESTful风格的服务:代码续:注意只设置地址和端口 就可以了。因为在类上 已经添加了Path注解。北京传智播客教育 www.itcast.cn
  • 27. 使用HttpClient调用:-使用POST调用保存方法:北京传智播客教育 www.itcast.cn
  • 28. HttpClient使用GET保存: - 注意在path中的参数北京传智播客教育 www.itcast.cn
  • 29. HttpClient调用查询所有:对于返回的JSON数据,可以使用 Json_lib或是fastjson解析。再此不 再多做说明。北京传智播客教育 www.itcast.cn
  • 30. 使用Ajax访问RESTful服务:- 获取所有数据北京传智播客教育 www.itcast.cn
  • 31. 使用Ajax访问RESTful服务:- 使用GET或POST保存:北京传智播客教育 www.itcast.cn
  • 32. RESTful总结:可见,使用RESTful的服务,调用会被的更加简单。且能使用JSON数据格式。相信这应该是WebService的发展方向。 以上都是基于Java项目的。下面将研究WEB项目。北京传智播客教育 www.itcast.cn
  • 33. WebService-CXF-Spring 基于web的cxf王健北京传智播客教育 www.itcast.cn
  • 34. 以下分成两个部分:1、独立运行的JavaWeb项目。 2、Struts2与Spring整合的Web项目。北京传智播客教育 www.itcast.cn
  • 35. 第一:开发cxf的独立web项目: 由于cxf的web项目已经集成了Spring,所以cxf的服务类都是在spring的配置文件中完成的。以下是步骤: 第一步:建立一个web项目。 第二步:准备所有jar包。将cxf_home\lib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。 第三步:在web.xml中配置cxf的核心servlet,CXFServlet。 第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。北京传智播客教育 www.itcast.cn
  • 36. 添加Jar包的说明:前面讲的第二步,是将所有jar文件放到WEB-INF/lib目录下,对于了解CXF开发的人员可以手工检索,最少需要以下Jar文件: 学生也可以通过学习WITCH_JARS文件来查询具体需要哪些jar文件。北京传智播客教育 www.itcast.cn
  • 37. web.xml的配置如下:1、配置cxf的核心Servlet2、默认即读取此配置文件, 配置或是不配置也可以。3、配置所以ws访问的路径北京传智播客教育 www.itcast.cn
  • 38. Web.xml的配置2:由ApplicationContext有域的概念,如果将cxf-servlet.xml文件配置成由CXFServlet来读取,则在我们的Servlet中,就获取不到ApplicationContext了。 为了能在Servlet中也可以获取ApplicationContext.一般我们将cxf-servlet.xml文件,配置成由Spring的ContextLoaderListener来读取。配置如下:北京传智播客教育 www.itcast.cn
  • 39. Cxf-servlet.xml文件说明:Cxf-servlet.xml文件,就是一个spring的配置文件。一个空的配置文件如下。北京传智播客教育 www.itcast.cn
  • 40. 在地址栏访问: -配置好空项目后,可以先测试是否可以启动成功:http://localhost:9999/cxf_spring/ws 如果有WebService的存在,则会显示出来,如果没有,则会显示上 而的信息。北京传智播客教育 www.itcast.cn
  • 41. 发布WebService: (jax-ws)此处可以引用另一个已经声明的SpringBean北京传智播客教育 www.itcast.cn
  • 42. 发布WebService – Jax-ws : 引用一个已经配置好的Spring Bean北京传智播客教育 www.itcast.cn
  • 43. 配置说明:CXFServlet类,通过读取config-location的配置项读取cxf-servlet.xml配置文件。并在内部读取自己的配置文件cxf.xml文件。 在CXFServlet读取配置文件后,将文件信息全部读取到ApplicationContext的Spring类中。 以下是它的源代码: 北京传智播客教育 www.itcast.cn
  • 44. 通过配置给服务添加消息拦截器:LoggingInInterceptor LogginOutInterceptor 北京传智播客教育 www.itcast.cn
  • 45. 在地址栏访问:-以下项目每多配置一个,都会多一行数据:http://localhost:9999/cxf2.4_spring_web/ws北京传智播客教育 www.itcast.cn
  • 46. 通过多种不同的方式调用你的webService:1、使用wsdl2java或是wsimport生成本地代码的方式调用。略 2、使用URLconnection的方式调用。略。 3、在本项目中使用本项目的应用调用。见下一页ppt. 4、使用ajax方式调用。见下一页ppt。这是模拟的页面北京传智播客教育 www.itcast.cn
  • 47. 关于web项目配置的说明4:在自己的项目中获取Spring Bean并调用。北京传智播客教育 www.itcast.cn
  • 48. 通过ajax方式调用:北京传智播客教育 www.itcast.cn
  • 49. 发布和调用RESTful风格的WebService:准备jsr311.jar和jettison.jar. 给Person的JavaBean添加@XMLRootElement注解。 北京传智播客教育 www.itcast.cn
  • 50. 书写JAX-Rs的服务类:北京传智播客教育 www.itcast.cn
  • 51. 发布jax-rs的RESTful服务:北京传智播客教育 www.itcast.cn
  • 52. 发布成功以后页面显示的内容如下:北京传智播客教育 www.itcast.cn
  • 53. RESTful风格的webService客户端调用的方式:不支持本地代码的生成,即不能使用wsdl2java或是wsimport. 使用以下方式调用: Ajax. – 以下是调用测试。 HttpClient (略)北京传智播客教育 www.itcast.cn
  • 54. Ajax调用RESTful的服务: - 更多代码,请见备注处:北京传智播客教育 www.itcast.cn
  • 55. Struts2整合Spring+cxf项目:-CRUD一个封闭的项目,如何通过cxf对外公布web服务。 如一个系统,对于不同的终端提供查询服务.北京传智播客教育 www.itcast.cn
  • 56. 开发步骤:1、建立一个web项目。 2、提供Struts2+Spring的支持。 3、添加cxf的支持。 4、只开发一个模块做为测试。完成CRUD。 5、通过配置发布一个WebService-直接使用service层。 6、外部访问。 1、通过Java代码访问。-注意使用-p参数生成新的包结构。 2、通过JS代码访问。jQuery.北京传智播客教育 www.itcast.cn
  • 57. Struts2+Spring+cxf添加Struts2的配置文件. 添加struts-spring_plugins-x.jar 添加Struts要求的其他包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar struts2-core-2.2.1.jar xwork-core-2.2.1.jar北京传智播客教育 www.itcast.cn
  • 58. 在Web.xml中添加以下配置:北京传智播客教育 www.itcast.cn
  • 59. Spring与Struts整合以后的配置文件如下:北京传智播客教育 www.itcast.cn
  • 60. 通过JS来调用WebService:通过jQuery的ajax方法向服务器发送xml数据。 必须要先了解xml的数据格式,通过拦截器获取。 可以从LoggingInInterceptor中获取发出的数据格式。 可以从LoggingOutInterceptor中获取返回的数据。 导入jQuery1.5.js文件,放到js/jquery1.5.js北京传智播客教育 www.itcast.cn
  • 61. 通过Ajax访问WebService使用jQuery-本域 $.ajax({ url:.. type:’post’, dataType:’xml’, contentType:’application/soap+xml;charset=“UTF-8”’ data:someXml, Success:fun()… })北京传智播客教育 www.itcast.cn
  • 62. 在本域使用jquery访问: --查询所有用户:北京传智播客教育 www.itcast.cn
  • 63. 仅且仅通过一个页面即可以获取数据:向服务器保存用户北京传智播客教育 www.itcast.cn
  • 64. 课程回顾:什么是WebService? 在Jdk6上使用Endpoint发布WebService。 使用wsimport生成客户端代码。及各种监控工具的使用。 CXF的安装。 wsdl2java工具的使用。 CXF与spring进行整合。 使用struts+Spring+cxf访问WebService. 使用Ajax直接发送SOAP请求。北京传智播客教育 www.itcast.cn
  • 65. Web服务为我们带来了什么: (这是一种思想,不是简单的代码实现)北京传智播客教育 www.itcast.cn