随笔 - 181, 文章 - 2, 评论 - 85, 引用 - 0
数据加载中……

用于实现 Web 服务的 SOA 编程模型,第 5 部分: 面向服务的用户界面

面向服务的编程模型可以简化程序到用户 (program-to-human) 的交互的开发,方法是在用户或者管理员控制下在表示层抽象化接口、标准化消息以及聚合独立信息源。本文是关于 IBM 的 SOA 编程模型的系列文章的第 5 部分,介绍了用户面对的服务并提供了用户界面 (UI)。本系列前面的文章介绍了与语言无关的数据访问和基于面向服务的体系结构(Service-Oriented Architecture,SOA)概念的 Web 服务的编程模型。

面向服务的体系结构的用户界面

在文献中,对 Web 服务的讨论通常是在程序到程序 (program-to-program) 交互的上下文中进行的。然而,

模型-视图-控制器(Model-View-Controller,MVC)范例是现代大多数 UI 应用程序框架的基础。SOA 操作提供模型层,而 UI 位于视图层。UI 技术可以在各种设备上呈现信息,这些设备包括的范围很广,从窗口小部件和智能电话到浏览器和能够进行大量客户端处理的富客户机。中间件和工具将视图层 UI 技术连接到模型层 Web 服务和数据。

在 SOA 方法中,宿主组件的环境抽象成容器,它提供已知的服务集。从 UI 的角度来说,承载客户端 UI 组件的三个主要的容器是:

  • 基本 Web 浏览器。
  • 使用 Java™Script 和动态 HTML 增强的 Web 浏览器。
  • IBM Workplace™ Client Technology™——具有本地 IBM WebSphere® Application Server 客户机支持的 Eclipse 富客户机。

这些容器可以通过支持下列技术得以增强:Servlet、JavaServer Page (JSP) 和 JSP Tag;用于页面排序的 Struts;用于高级页面组合的 JavaServer Face (JSF);以及合并在同一页面上的多应用程序视图的 Portlet 技术。

UI 开发框架

UI 开发框架可以简化创建面对用户的复杂应用程序的过程。通常使用下列的 UI 框架来创建 UI 组件:

  • Struts,拥有最大的开发人员社区和异常工具支持,是 Apache 开放源代码项目,它早于 Java Portlet 规范 JSR 168(请参阅参考资料以获得 Struts Web 站点的链接)。Struts 是使用 servlet/JSP 范例开发基于服务器的 UI 的多页 MVC 框架。Struts 的一个特殊版本 V1.1 库支持 IBM WebSphere Portal 上的 JSR 168 Portlet。
  • JavaServer Faces 是 Java Web 应用程序的 MVC 实现,以增量方式构建于以前的技术之上。它很好地适应了 Portlet 开发,提供 Portlet 和 Servlet、声明处理、确认和事件处理。JSF 页面具有一个或多个与该页面上的 UI 控件交互的本地模型。这些控件将 UI 属性呈现给输出,而复杂的逻辑确保它们的表示是在“正确的”地方。客户端模型可以连入企业服务总线 (Enterprise Service Bus) 来发送和接收事件。
  • Java Widget Library (JWL),是一个可供门户和 Portlet 程序员使用的扩展窗口小部件集,向 JSF 添加 JavaScript 客户端处理,而且将得到 IBM Rational® Suite® DevelopmentStudio 的支持。更新客户机本地视图省去了往返服务器的过程,缩短了几个数量级的响应时间,而且极大地改善了用户体验。

门户 提供了最好的 UI 支持。在门户体系结构中,Portlet(通常是使用上面提到的某种 UI 框架开发的)是基本构件。使用这种体系结构,开发人员可以把主要精力放在他们的应用程序的独特方面,并且将生命周期、每个用户的自定义、聚合以及与其他组件的集成等公共功能委派给中间件。

下面几部分将单个服务和门户的 Portlet 组件描述成服务聚合机制。







面向服务的 UI 的 Portlet

Portlet 组件实现了标准服务接口和协议。Java Portlet 规范和用于远程 Portlet 的 Web 服务(Web Services for Remote Portlet,WSRP)标准分别定义了 Java 和 Web 服务的这个接口(请参阅参考资料以获得更多关于 WSRP 的信息)。这两个标准非常相似,以致如果存在合适的容器或者代理,为任一接口编写的 Portlet 都可互换。

Java Portlet 示例

每个 Java Portlet 都实现了该 Portlet 接口或者扩展了实现它的类。这个接口定义了 Portlet 和它的容器之间的服务约定,以及 Portlet 的生命周期:

  • 初始化 Portlet 并将其放入服务中(init 方法)
  • 处理请求(processActionrender 方法)
  • 除去服务的 Portlet(destroy 方法)

在处理请求期间,Portlet 容器调用 Portlet 的:

  • processAction 方法来通知 Portlet 用户行为。每个客户机只有一个基于用户的行为被触发。Portlet 可以发出一个重定向、改变它的 Portlet 模式或窗口状态或者更改它的状态。
  • render 方法来请求标记片段。

Portlet 还可以调用更多的服务来执行所需的功能。清单 1 示例使用 Web 服务来检索和显示特定用户的股票报价。


清单 1. 股票报价 Portlet 代码示例
												
																		public class StockQuotePortlet extends GenericPortlet {

	private ServiceManager serviceManager;

	public void init(PortletConfig config) throws PortletException {
		serviceManager = new ServiceManager();
	}

	public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
		
        	response.setContentType("text/html");    

        	// invoke autogenerated wrapper to locate service
		NetXmethodsServicesStockquoteStockQuoteServiceLocator loc = 
			new NetXmethodsServicesStockquoteStockQuoteServiceLocator();
		NetXmethodsServicesStockquoteStockQuotePortType port = 
			loc.getNetXmethodsServicesStockquoteStockQuotePort();

		// loop through all stock quotes the user is interested in
		PortletPreferences prefs = request.getPreferences();
		Iterator quoteKeys = prefs.getMap().keys().iterator();
		String key;
		Float quote;
		StockBean quoteBean = new StockBean();
		while ( quoteKeys.hasNext() ) {
			key = quoteKeys.next();
	    		quote =  port.getQuote (key);
			quoteBean.add(key, quote);
		}

		request.setAttribute("StockQuoteBean", quoteBean);

		// render stock quotes using a JSP        
        PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher("jsp/View.jsp");
        rd.include(request,response);

	}
}
			
												
										

这一部分演示了您可以如何使用 Java Portlet 规范来实现 UI 服务,以及您的 Portlet 可以如何调用其他 Web 服务。下一部分将展示如何使用 WSRP 将 UI 作为 Web 服务发布。

用于远程 Portlet 的 Web 服务

WSRP 是远程呈现 Portlet 的标准,使门户能够从多个源聚合内容。WSRP 将 Web 服务的集成能力扩展到面向表示的组件,并将视图层公开为跨平台、实现语言和供应商共享。可以发现内容和应用程序提供者并将其插入遵循标准的应用程序中,而不必进行任何额外的编程工作。

典型的 Web 服务使用远程表示范例,这意味着所有的视图逻辑在客户机上执行,而应用程序逻辑和数据层(控制器和模型)则驻留于服务器上。与此相反,WSRP 使用分布式范例将客户机和服务器的表示分开。


图 1. 面向数据的 Web 服务和 WSRP 面向表示的 Web 服务的比较
WSRP 比较

上图展示了这一差异。左边是典型的面向数据的 Web 服务,它提供了无格式的数据;它必须完全依赖于客户端的呈现代码来表示数据。(这意味着需要在客户机上安装和管理客户端应用程序组件。)右边是 WSRP 服务;它的分布式表示逻辑将表示任务分成:

  • 生成标记语言。
  • 将标记片段聚合成一个 Web 页面(没有显示)。
  • 通过标准客户端容器呈现标记语言。

WSRP 示例

清单 2 展示了一个通过简单对象访问协议(Simple Object Access Protocol,SOAP)从 WSRP 使用者发出的 WSRP getMarkup 请求的示例。


清单 2. 通过 SOAP 发出的 WSRP GetMarkup 请求
												
																		<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 				 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <soapenv:Body>
         <getMarkup xmlns="urn:oasis:names:tc:wsrp:v1:types"> 
            <registrationContext>
               <registrationHandle>192.168.66.57_1096235652731_0</registrationHandle> 
            </registrationContext>
            <portletContext>
               <portletHandle>0.1</portletHandle>   
            </portletContext>   
            <runtimeContext>    
               <userAuthentication>wsrp:none</userAuthentication>    
               <portletInstanceKey>ProxyTest_row1_col1_p1</portletInstanceKey>    
               <namespacePrefix>Pluto_ProxyTest_row1_col1_p1_</namespacePrefix>   
            </runtimeContext>   
            <userContext>    
               <userContextKey>dummyUserContextKey</userContextKey>   
            </userContext>   
            <markupParams>    
               <secureClientCommunication>false</secureClientCommunication>    
               <locales>en</locales>    
               <locales>de</locales>    
               <mimeTypes>text/html</mimeTypes>    
               <mode>wsrp:view</mode>    
               <windowState>wsrp:normal</windowState>    
               <clientData>     
                  <userAgent>WSRP4J Proxy Portlet</userAgent>    
               </clientData>    
               <markupCharacterSets>UTF-8</markupCharacterSets>    
               <validNewModeswsrp:view</validNewModes>    
               <validNewModes>wsrp:help</validNewModes>    
               <validNewModes>wsrp:edit</validNewModes>    
               <validNewWindowStates>wsrp:normal</validNewWindowStates>>    
               <validNewWindowStates>wsrp:maximized</validNewWindowStates>    
               <validNewWindowStates>wsrp:minimized</validNewWindowStates>   
            </markupParams>  
         </getMarkup> 
      </soapenv:Body>
   </soapenv:Envelope>
 			
												
										

WSRP 生产者对这个请求的响应是 HTML 片段,使用者(通常是门户)可以将其聚合成一个完整的文档,例如门户页面。

不是将每个应用程序或 Portlet 部署到有意使用它的每个服务器上,而是跨网络边界共享应用程序,这具有明显的优势。WSRP 支持:

  • 更简单的管理——门户管理员可以浏览要提供的 WSRP 服务的注册中心,而不是管理可插入组件的本地部署。用户受益于及时使用随需应变的新服务和内容集成。
  • 负载分配——跨多个服务器分配负载。
  • 减少基础设施成本——应用程序可以共享承载的基础设施。例如,只分配后端银行应用程序的表示层(通过 WSRP)保护了应用程序提供者的安全计算环境,而与此同时,用户仍可以与共享的 UI 进行交互。
  • 控制内容表示——在门户重新分配内容时,内容和应用程序提供者可以极大地扩展新用户的范围。






门户:面向服务的 UI 的动态集成

门户的视图层将多个后端服务的 UI 集成为一个集中管理的 UI,这样可以统一分离的 IT 基础设施,并通过控制单一的 UI 向用户提供 IT 服务的单一视图。最初分开设计的应用程序可以连接起来构成组合应用程序,用于支持新的功能。例如,连接到协作 Portlet 的电子邮件 Portlet 可以过滤收件箱,使仅当寄件人在线并可以聊天时才显示所收到的电子邮件——这种能力是这两个原始应用程序所不具备的。

这种 portal 模型的重要意义在于改善了随需应变业务 (On Demand Business) 的敏捷性。管理员成为应用程序集成者,定义新的页面,向它们添加 Portlet,将 Portlet 连接在一起并设置权限(访问控制)——不用编程——来创建新的组合应用程序。自服务的门户使用户可以改变他们的工作环境,以适应他们独特的需求。门户体系结构解放了应用程序开发人员,使其能够全神贯注地创造新的业务价值。

将来,门户甚至能够集成组合服务,因而能够在更高的层次上聚合 UI。门户可以无缝地与来自其他门户的内容相集成,从而提供水平的、企业级的内容集成。







总结

使用门户/Portlet 体系结构,将 SOA 概念应用到用户界面,并委派公共的软件生命周期功能给 UI 容器,这改善了软件开发人员的时间价值 (time-to-value)。WSRP 标准通过 Web 服务交付 UI 组件,为内容提供者和内容使用者提供便利,从而在不用进行任何编程的情况下支持某种类型的应用程序集成。

posted on 2006-04-17 04:01 wsdfsdf 阅读(164) 评论(0)  编辑 收藏 引用 所属分类: 技术文章


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理