J2EE环境下WebServices框架的实现
2009-01-08
作者:谢飞
1.框架背景
J2EE是跨平台的,而WebServices的核心XML也是跨平台的,因此两者结合更能发挥它们各自的功效。关于WebServices的概念、作用、实现等,本文不作详细的介绍,背景部分主要介绍一下在J2EE环境下实现WebServices框架所需要的环境。
(1)Tomcat
本框架使用的Web服务器为Tomcat4.x,具体下载地址:http://jakarta.apache.org。遵循J2EE1.3规范,包括JSP1.2和Servlet2.3。由于Axis是以Web应用的形式发布的,所以需要一个Web服务器。
(2)Axis
Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP with Attachments 规范(来自 Apache Group )的开放源代码实现。Axis的最新版本是1.1,可以从http://ws.apache.org/axis/index.html下载。
(3)JAXB
JAXB是一个数据绑定工具,相关资料和下载可以到java.sun.com/webservices/,JAXB主要可以实现:把 XML 数据转化成 Java 类(或者多个类);把 Java 数据转化成 XML 文档。使用 JAXB 时需要一个 XML Schema 以生成类和数据结构。
2.框架目标
本框架主要目的是使开发WebServices应用变得简单、高效,使WebServices应用易于扩展和维护。具体来讲,包括以下几方面:
(1)提供给用户的WebServices接口简单,提供单点入口,这样用户不需要记住很多繁琐的方法。
(2)WebServices的服务端和客户端的数据全部通过XML交互,目前很多行业都形成了XML规范,例如旅游电子商务,如果严格按照XML规范,可以达到各个系统之间的整合。
(3)WebService的调用通过XML事件实现。一个XML文档就是一个WebServices事件,激发一个系统后台的调用。
(4)维护WebServices方便,例如方便的添加、修改、删除一个WebServices提供的功能。
(5)方便测试WebServices提供的功能,可以在脱离WebServices的环境下测试。
3.框架实现原理
一个WebServices访问大致流程为:首先互联网用户向WebServices客户端服务器发出某请求,然后客户端服务器发送一个XML事件到WebServices服务器,WebServices服务器解析XML事件,调用相应的后台业务逻辑,并将结果以XML的形式返回给客户端。本框架是用于基于Servlet的WebServices,主要任务就是解析XML事件,调用相应的业务逻辑,然后将结果以XML的格式反馈给客户方,其中还包括了错误处理。具体的流程图如下:
① WebServices客户端首先根据用户的请求封装XML,然后发送到WebServices服务器端。其中的XML文档必须符合WebServices服务器端定义的Schema,一个不同的XML文档对应一个不同的请求。其中XML最好能遵循行业规范,例如旅游电子商务XML规范,有利于和其他系统交互。
② WebServices服务器端的Servlet服务程序为WebServicesEngine,提供唯一的访问入口doService(),所有的客户端都是访问WebServicesEngine的doService()方法。当服务器端接收到一个XML事件请求,首先解析这个XML(可以通过JAXB或者castor),然后调用相应的系统Action,Action的主要任务为获取XML中的数据。
③ Action将XML数据封装成系统的Model,然后调用WebServices的业务代理层。
④ WebServices的业务代理层调用后台应用服务器的EJB。
⑤ 后台执行完后,将结果返回给WebServices的业务代理层。
⑥ WebServices的业务代理层将结果返回给Action。
⑦ Action再将具体的结果封装成XML返回给WebServicesEngine。
⑧ 最后WebServicesEngine将XML返回到WebServices客户端。
具体的XML请求和Action的对应关系在一个request.xml中定义,对于客户端来说,一个XML文档就是一个功能请求,对于WebServices开发者来说,一个Action就是一个提供给外界的功能,两者的关系由request.xml决定。其中这个request.xml具体由WebServicesEngine解析。
4.框架具体实现
(1) 将XML Schema转化为java程序。
首先需要安装jaxb,然后执行命令:xjc.bat -p com.webservice.jaxbmodel WebService.xsd -d src,即可在src目录下生成java程序,然后编译。
(2) 解析XML请求,然后选择相应的Action执行请求
首先定义request.xml文件,格式如下:
其中CreateOrderRequest是由JAXB从XML Schema生成出来的类,当XML请求到达,首先通过JAXB把XML文档unmarshal成java对象,例如CreateOrderRequest,然后通过反射机制查找到类CreateOrderAction,然后实例化,然后执行Action的execute方法调用后台具体的业务逻辑。为了提高效率,可以把Action设置成单例,类似于Struts(jakarta.apache.org)的Action,其中Action只做流程控制。
(3) 错误处理
考虑到WeServices客户端的多样性,例如.NET、VB、Delphi等,有些语言并没提供类似于java的例外(Exception)处理,因此本框架并未使用例外机制,而用一个专用的XML文档表示错误信息,其中有一个ErrorCode来表示具体的错误信息。格式如下:
如果返回给客户端的XML为错误文档,则可以根据ErrorCode查询到具体的错误信息。具体ErrorCode的错误信息由WebServices提供者提供。
(4) 返回XML结果
WebServices客户端接收到XML文档后,需要首先解析此XML是否为错误XML文档,如果是,则将错误的信息显示给用户,否则,解析XML文档,将XML数据反馈给最终用户。
5.框架展望和小结
本框架的主要目的就是加快用户开发WebServices的速度,如果对已有系统开发WebServices,则只需要首先制定一些XML规范(Schema),然后编写相应的Action,Action去调用现有的业务逻辑,而不用去关心WebServices的具体细节,如此一来,可以大大的提高效率。
当然,此框架还有很多未考虑的因素,例如WebServices安全等,因此有待进一步改善。
参考资料:
1.http://java.sun.com/webservices/
2.http://ws.apache.org/axis/index.html
3.IBM developerWorks中文网站