将模式转换为 J2EE Servlet
清遵循以下步骤将模式转换为 J2EE Servlet:
创建动态 Web 项目。
右键单击模式,并选择 Transform>Pattern to WebServiceFacadeServlet,如图 4 中所示。
指定在步骤 1 中新创建的 Web 项目。
图 4. 调用转换

图 5 显示了生成的包装 Servlet。
图 5. 生成的包装 Servlet

更新、部署和调用生成的 J2EE Servlet 代码
遵循以下步骤,以更新生成的代码,从而支持其他资源表示格式和从 SOAP 消息提取附件:
查看生成的 Servlet 代码:
通过扩展 J2EE HttpServlet 抽象类和实现对应的 J2EE Servlet 方法(如 doGet、doPost 和 doDelete),可在生成的 Facade Servlet 中支持指定的 HTTP 方法。
清单 1 显示了生成的代码,该代码使用 SAAJ 调用了现有的 Web 服务。
清单 1. 用于使用 SAAJ 调用现有 SOAP Web 服务的代码示例MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage message = messageFactory.createMessage(); //Create objects for the message parts SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody body = envelope.getBody(); envelope.getHeader().detachNode(); //Populate the body //Create the main element and namespace SOAPElement bodyElement = body.addChildElement(envelope .createName(operation, "req", ns)); //Add content bodyElement.addChildElement("prodid").addTextNode(para0); bodyElement.addChildElement("prodtype").addTextNode(para1); //Save the message message.saveChanges(); URL endpoint = new URL(endPoint); SOAPMessage respMsg = connection.call(message, endpoint)
清单 2 显示了用于支持浏览器缓存的生成代码。
清单 2. 用于设置浏览器缓存 HTTP Header 的代码示例response.setHeader("Cache-Control", "public");
清单 3 显示用于解析相应资源表示形式和恰当设置 MIME 内容类型的生成代码。
清单 3. 有关资源表示形式和内容格式协商的代码示例String[] pattern_accepts={"text/xml"}; String req_accepts = request.getHeader("Accept"); RESTResourceRepresentationContext repContext = new RESTResourceRepresentationContext(); String format_decision = repContext.getAcceptFormat(pattern_accepts, req_accepts); response.setContentType(format_decision); repContext.registerDefaultStrategies(); repContext.generateAppropriateResourceRepresentation(respMsg,printer);
更新生成的代码。可能需要进行以下类型的代码更改:
支持新的资源表示格式。为了创建自定义应答格式,请通过从 RESTResponseStrategy 类继承并向 RESTResourceRepresentationContext 类的 registerStrategy() 操作进行注册来创建新策略。
使用 SAAJ 获取大型附件,以便通过 HTTP 进行流化。可以使用 SoapMessage#getAttachments() 方法来从 SOAP 信封提取附件。可以将采用这种方式提取的附件通过 HTTP 响应对象发送到客户机。
将 Web 项目部署到 J2EE 1.4 应用服务器中,如图 5 中所示。
使用从参数构造的 URL 调用 Facade :http://localhost:9080/<FacadeURLContextPath>/<FacadeURLServletPath>?<Parameter=value>[: Parameter=value]
按图 6 中的示例所示的方式在 REST 服务客户机中查看操作的结果。
图 6. 使用 Web 浏览器访问 REST 包装

模式插件的源代码
可以对模式插件的源代码(请参见下载)进行修改,以捕获您的开发组织创建 REST 样式的 Web 服务 Facade 的最佳实践。
何时不使用 REST 体系结构样式
尽管 REST 体系结构样式在很多情况下都非常具有吸引力,但可能在某些情况下并不适合。以下就是一些这样的例子: 对于非结构化请求或响应格式,优先选用远程过程调用类型的服务调用。 例如,在两个帐户之间进行资金转帐的事务型 Web 服务就是如此。缺省情况下使用 REST 样式的 Web 服务并不提供事务完整性支持,但可以将此支持添加到 SOAP 样式的 Web 服务。 服务调用中涉及到多个协议。 例如,考虑要支持同步样式接口而不是异步样式接口。 需要通过业务流程执行语言(Business Process Execution Language,BPEL)集成到业务流程。 目前 BPEL 流程并不支持 REST 样式的接口。只有服务组件体系结构(Service Component Architecture,SCA)组件可以编排在 BPEL 流程中。
结束语
REST 样式 Web 服务 Facade 提供某些所需的功能,如多资源格式表示形式、支持响应的浏览器缓存以及支持 PUT、TRACE 和 DELETE 等其他 HTTP 方法。本文提供的 RAS 模式资产捕获用于开发 REST 样式的 Web 服务 Facade 的最佳实践。
(编辑:aniston)
|