16.5 使用CXF提供Web Service
阅读过笔者所著《Struts 2.1权威指南》的读者可能已经发现:本章所介绍的开发过程与《Struts 2.1权威指南》中电子拍卖系统的开发过程有些相似。确实如此,本章所介绍的电子拍卖系统同样也可作为Web应用使用,不同的是本章的电子拍卖系统还增加了Web Service功能。
提示
本章的重点是介绍Web Service功能,因此如何开发该系统的前台功能,包括开发Action和JSP页面,就超出了本书的介绍范围,有兴趣的读者可自行参考《Struts 2.1权威指南》最后一章。
本章使用CXF为本系统增加Web Service功能。由于CXF和Spring可以无缝地整合,因此可以将Spring容器中Bean的方法暴露成业务Web Service操作,下面详细介绍实现过程。
16.5.1 启用CXF支持
为了在该应用中启用CXF支持,首先应该将CXF的核心JAR包cxf-2.2.2.jar复制到Web应用的WEB-INF/lib路径下。除此之外,还应将CXF所依赖的第三方类库复制到Web应用的WEB-INF/lib路径下。
为了在应用中整合CXF和Spring,首先应该在web.xml文件中使用如下代码来启动Spring容器:
程序清单:codes\16\auction\WEB-INF\web.xml
在web.xml文件中增加上面的配置片段之后,Web应用将在启动时自动加载applicationContext.xml和daoContext.xml两个配置文件,并根据这两个配置文件来创建Spring容器。
接下来需要在web.xml文件中配置CXF的核心Servlet,该Servlet负责处理Web Service客户端请求。下面是配置CXF核心Servlet的代码:
程序清单:codes\16\auction\WEB-INF\web.xml
在web.xml文件中增加如上所示的配置片段之后,来自/services/下的所有请求都将由CXFServlet负责处理,也就是说由CXF提供的Web Service位于http://localhost:8888/<appName>/services/路径之下。
由于本应用将和Struts 2框架结合使用,而Struts 2框架的FilterDispatcher会拦截所有用户请求,包括来自/services/下的请求,因此为了让Struts 2框架将来自/services/下的请求“放行”给CXFServlet,应该在Struts 2的配置文件最后增加如下配置片段:
上面这段配置片段主要是为了让CXF和Struts 2并存而增加的,如果不需要让Struts 2和CXF结合使用,则没有必要增加上面的配置片段。
16.5.2 实现Web Service
为了将Spring容器中已有的Bean暴露成Web Service,先应该为所有Web Service操作定义一个接口,在该接口中定义所有希望暴露成Web Service的方法,下面是本应用里的Web Service接口:
程序清单:codes\16\auction\WEB-INF\src\org\crazyit\auction\ws\AuctionWs.java
如在第14章中所见,定义该接口时我们使用了@WebService 注释来修饰,这意味着该接口将可被转换为Web Service。
由于系统不维护Web Service客户端和服务器之间的会话信息,Web Service服务器端不知道调用者的身份信息,因此上面定义的Web Service操作要求调用者传入用户名、密码作为请求参数,这样即可根据用户名、密码确定调用者的身份。
定义了上面的Web Service接口之后,接下来应该为该接口提供实现类,该Web Service实现类需要依赖于Spring容器中的业务逻辑组件来实现。换句话说,该Web Service实现类仅仅是对Spring容器中业务逻辑组件的再次包装,因此必须将Spring容器中的业务逻辑组件注入Web Service实现类中,下面是Web Service实现类的代码:
程序清单:codes\16\auction\WEB-INF\src\org\crazyit\auction\ws\impl\AuctionWsImpl.java
从上面的粗体字代码中可以看出,该Web Service实现类可接受Spring注入的AuctionManager组件,而Web Service实现类里各方法的实现都需要依赖于AuctionManager组件。因此可以看到AuctionWsImpl每个方法的实现都需要调用AuctionManager组件中对应的方法。
提供上面的Web Service接口和实现类之后,只要在Spring配置文件中通过CXF启用该Web Service即可。为此需要在Spring配置文件的根元素中增加CXF配置文件的Schema信息,即将Spring配置文件的根元素修改为如下形式:
除此之外,还需要在该配置文件中导入CXF的3个XML文档,代码如下:
准备了上面的代码之后,接下来只要在Spring配置文件中增加如下代码片段用于暴露Web Service即可:
从上面的第一行粗体字代码可以看出,在Spring容器中配置AuctionWsImpl Bean实例时,先利用Spring的依赖注入将业务逻辑组件注入到Web Service实现Bean中,然后利用CXF提供的<jaxws:endpoint…/>元素即可将指定Bean实例转换为Web Service。
16.5.3 测试Web Service
经过上面的步骤即可将Spring容器中的业务逻辑组件暴露成允许远程访问的Web Service,在浏览器的地址栏中输入http://localhost:8888/auction/services/auction?wsdl,然后回车即可看到图16.13所示界面。
图16.13 Web Service的WSDL文档
图16.13显示了本系统中Web Service的WSDL文档,无论何种平台、何种语言的Web Service客户端都可调用本系统提供的Web Service。
下面就以我们最熟悉的Java语言为例,简单示范用客户端调用系统中提供的Web Service操作。下面是示范客户端的代码:
程序清单:codes\16\auctionClient\src\org\crazyit\auction\client\Client.java
上面的客户端只测试调用了Web Service的3个操作,用于获取系统中所有的物品种类,访问系统中所有流拍物品,以及向系统中新增一个拍卖物品。通过运行Web Service客户端也可测试到Web Service暴露成功。至于Web Service系统中的其他方法,读者可以自行测试。熟悉其他编程语言的读者,也可使用其他编程语言来访问本系统的Web Service。