日期:2014-05-20 浏览次数:20922 次
?????? 门户( Portal )一词从最初被提出,到 2003 年十月发布的 Portlet1.0 规范以及 2005 年十二月重新投票通过的 Portlet2.0 规范以来,已经有很长一段历史了。非常流行的 Spring 框架也在 2.0 M 1 版本将 Potlet MVC 框架融入进来。但 Portlet MVC 框架和现在流行的 MVC 框架的无缝整合还是不太理想,直接影响 Portlet 技术的普及率。那么此技术究竟是历久弥新的技术还是日渐消亡,最终被取代的技术?不是本文所要说明的重点。本文主要是从一个 Portal 初学者的角度对 Portal 的主要概念,应用场景等等做一些简单的描述,作为本阶段 Portal 研究的一个总结报告,并为将来做更深层次的研究做好准备。
?????? 这部分主要针对 JSR168 规范中的主要内容做了一些说明。
?????? 。另外,基于规则的个性化,一些在个性化服务方面领先的商业实现版本允许你自定义为用户显示什么样的页面所依据的标准(如收入和兴趣)。在这种情况下,可以设定像“对收入为 X 的用户显示馈赠商品的 portlet ”和“对收入为 X 用户显示打折商品的 portlet ”这样的商业规则。例如, WebSphere Portal 5 的个性化功能可以基于规则引擎,用户喜好( preference )和用户属性信息( profile )来定制用户相关的个性化页面。 Weblogic Portal 的文档中是这样描述个性化内容的,“个性化内容就是根据特定上下文(通常和当前用户相关联)而生成的内容。在 Weblogic Portal 中,这个特定上下文一般包括用户属性信息( profile ),用户当前的请求( request ),用户当前的 session ,当前的日期和时间( date and time ),另外, Portal 也支持自定义业务规则来满足特定的用户需求”。
?????? 2) 单点登录:只需登录 Portal 服务器一次就可以访问所有其它的应用,这意味着你无需再分别登录每一个应用。例如一旦我登录了我的 intranet 网站,我就能访问 mail 应用、 IM 消息应用和其它的 intranet 应用,不必再分别登录这些应用。 Portal 服务器会为你分配一个通行证库。你只需要在 mail 应用力设定一词用户名和密码,这些信息将以加密的方式存储在通行证库中。在你已登录到 intranet 网站并要访问 mail 应用的时候, portal 服务器会从通行证库中读取你的通行证替你登录到 mail 服务器上。你对其它应用的访问也将照此处理。
?????? 3) 内容聚集: Portlet 规范中规定 portal 的主要工作之一是聚集由各种 portlet 应用生成的内容。 Portlets 是一种 Web 组件,就像 servlets 一样是专门为合成页面里的内容聚集在一起而设计的。通常请求一个 portal 页面会引发多个 portlets 被调用。每个 portlet 都会生成标记段,并与别的 portlets 生成的标记段组合在一起嵌入到 portal 页面的标记内。
?????? 1) portlet : Portlet 是被 portlet 容器所管理的基于 Java 技术的 web 组件,它处理客户端请求并生成动态内容。通常请求一个 portal 页面引发多个 portlets 被调用,每个 portlet 都会生成一个标记段,并与别的 portlets 生成的标记段组合在一起形成一个完整的 portal 页面展示给用户。每个 portlet 的生命周期被 portlet 容器所管理。每个 portlet 可能随当前登录用户不同而生成不同的内容。
?????? 2) portlet 容器: Portlet 容器负责管理 portlets 的生命周期并提供 portlets 的运行环境。它还提供 portlet preferences 的持久化存储功能。 Portlet 容器从 portal 接受请求并分配到它所管理的 potlets 中去执行。
?????? 3) portlets 和 servlets 的关系:
?????? portlets 在以下方面与 servlets 相似:
l???????? portlets 是基于 Java 技术的 web 组件;
l???????? porlets 由特定的容器管理;
l???????? portlets 生成动态内容;
l???????? portlets 的生命周期由容器管理;
l???????? portlets 通过请求 / 响应模式与 web 客户端交互。
?????? portlets 在以下方面与 servlets 相异:
l???????? portlets 只能生成标记段,而不是整个文档;
l???????? portlets 没有可供直接访问的 URL 地址。不过你还是能够让别人通过 URL 访问到 portlet ,你可以把包含该 portlet 的页面的 URL 发给他;
l???????? web 客户端通过一个 portal 系统和 portlets 交互;
l???????? portlets 包含 action 请求和 render 请求;
l???????? portlets 有预先定义好的 portlet 模式和窗口状态;
l???????? portlets 可以在一个 portal 页面上同时存在多个;
l???????? portlets 不能在响应中设置字符集编码和 HTTP 和 headers ;
portlets 和 servlets/JSP 的通讯:
?
portlet 容器和 servlet 容器的关系:
portlet 容器是 servlet 容器的扩展,于是 portlet 容器一般是建立在 servlet 容器之上并且具有 servlet 容器所有的功能, portlet 容器支持 Servlet 规范 2.3 。
?
?????? 4) portlets 附加的功能:
l???????? 设置参数的持久化存储: portlets 提供了一个 PortletPreferences 对象用来保存用户的设置参数。这些参数被存入一个持久化数据库,这样服务器重启后数据依然有效。开发者不必关心这些数据存储的具体实现机制。
l???????? 请求处理: portlets 提供了更为细粒度的请求处理。对于用户在 portlet 上动作时向该 portlet 发出的请求 ( 一种称为活跃期的状态 ) ,或者因用户在其它 portlet 上动作而引发的刷新页面请求, Portal 服务器提供了两种不同的回调方法来处理。
l???????? Portlet 模式: portlets 用模式的概念来表示用户在做什么。 JSR 168 定义了三种 Portlet 模式: VIEW 、 EDIT 和 HELP 。一个 portlet 实例在任何时候都可以恰巧在一种 portlet 模式下。其他自定义 portlet 模式(如配置和源)都是可能的。 VIEW 模式是默认的模式。 Portlet 规范建议 EDIT 模式允许 portlet 用户定制 portlet 实例,以及 HELP 模式显示关于 portlet 的用法信息。 Portlet 必须支持 VIEW 模式,但在 portlet 中对 EDIT 模式和 HELP 模式的支持是可选的。在使用 mail 应用的时候,你可能会用它来读信、写信或检查信件 ―― 这些都是 mail 应用的预定功能, Portlets 通常以 VIEW 模式提供这些功能。但还有一些活动,像指定刷新时间或(重新)设置用户名和密码,这些活动允许用户定制应用的行为,因此它们用的是 EDIT 模式。 Mail 应用的帮助功能用的是 HELP 模式。
l???????? 窗口状态:窗口状态决定了 portal 页面上留给 portlet 生成内容的空间。 JSR 168 定义了三种 Window 状态: NORMAL 、 MINIMIZED 和 MAXIMIZED 。 Portlet 实例任何时候都可以恰好是一种 window 状态。其他自定义 window 状态(如半页)也是可能的。在 NORMAL 状态下, portlet 占了屏幕区的一小部分。屏幕状态与其他 portlet 共享。在 MINIMIZED 状态下, portlet 的内容被隐藏 , portlet 只显示为标题条。在 MAXIMIZED 状态下, portlet 的内容占屏幕区的大部分。其他共享同一页面的 portlet 在 MAXIMIZED 状态下被隐藏。
l???????? 用户信息:通常 portlets 向发出请求的用户提供个性化的内容,为了能更加行之有效, portlets 需要访问用户的属性信息,如姓名、 email 、电话等。 Portlet API 为此提供了用户属性的概念,开发者能够用标准的方式访问这些属性,并由管理员负责在这些属性与真实的用户信息数据库(通常是 LDAP 服务器)之间建立映射关系。
l???????? portlet context :每个 portlet 关联一个 PortletContext 对象的实例。通过此对象,可以获得上下文相关的初始化参数,设置和保存一些上下文相关的属性以供别的 servlets 和 portlets 获取。另外还可以通过它得到一个 request dispatcher 对象来转发到 servlets 和 JSPs 。
图 2.3.1 显示了 Portal 页面的各种元素。
?
每个 portlet 页面由一个或多个 portlet 窗口组成,每个 portlet 窗口又分为两部分:一个是外观,它决定了 portlet 窗口的标题条、控制和边界的样式;另一个是 portlet 段,它由 portlet 应用填充。 Portal 服务器决定了 portal 页面的整体观感,像标识、标题条颜色、控制图标等。通过修改几个 JSP 和 css 模板文件就可以改变 portal 的整个观感。
?????? 为了成功地创建 portlet ,您必须遵照 portlet 生命周期。 javax.portlet.Portlet 接口中的方法定义了该生命周期,这些生命周期方法是 init() 、 render() 、 processAction() 和 destroy() 。
?????? 1) 初始化
?????? 当启动一个 portlet 应用或懒加载条件下 portal 容器需要某个 portlet 来执行来自客户端的请求时,需要执行 init() 方法。它用于获得所需的任何昂贵资源(如数据库连接),并执行其它一次性活动。在 portlets 初始化时,经常需要用到 portletConfig 对象获取初始化参数和各种资源。
?????? 2) 处理请求
?????? 通过调用 processAction() 方法处理不同种类的动作和 render() 方法呈现内容。通常是通过 portlets 创建的 URL 提交请求。 Portlet URLs 包括 action URLs 和 render URLs 两种类型。一般情况下,一个 aciton URL 对应一个 action 请求和当前 portle 页面上所有的 portlets 的 render 请求,一个 render URL 对应当前 portle 页面上所有的 portlets 的 render 请求。但是如果 portlet 使用了缓存技术,则 portal/portlet 容器可能不会调用 render() 方法,而直接从缓存中取出展现标记段。
l???????? 动作处理
调用 processAction() 方法,在此方法中可以获得 ActionRequest 和 ActionResponse 两个参数。通过 ActionRequest 参数,可以获取 action 请求的参数,窗口状态, porlet 模式, portal 上下文对象, portlet 会话对象和 portlet preference 数据。在处理 action 请求时,可以转发到一个指定的 URL 。通过 ActionResponse 对象, portlet 可以改变它的模式和窗口状态。
l???????? 呈现内容
调用 render() 方法,在此方法可以获得 RenderRequest 参数和 RenderResponse 两个参数。通过 RenderRequest 参数,可以获取 action 请求的参数,窗口状态, porlet 模式, portal 上下文对象, portlet 会话对象和 portlet preference 数据。通过 RenderResponse 对象可以生成呈现内容或委托给 servlet 或 JSP 生成呈现内容。但也有一些限制:第一,生成 HTML 标记段不得使用下列标签: base, body, iframe, frame, frameset, head, html 和 title ;第二,生成 XHTML 和基于 XHTML 标记段不得使用下列标签: base, body, iframe, head, html 和 title 。
javax.portlet.GenericPortlet 类提供了呈现内容的一些默认功能。我们创建的大多数 portlet 将会扩展 javax.portlet.GenericPortlet 类,而不是直接实现 javax.portlet.Portlet 接口。 GenericPortlet 类实现了 render() 方法。如果 portlet 的 window 状态被最小化,那么 render() 方法不能做任何事情。如果 portlet 的 window 状态不是最小化,那么 render() 方法设置在 portlet.xml 文件中指定的标题,并调用 doDispatch() 方法。根据 Portlet 模式, doDispatch() 方法适当地调用 doView() 、 doEdit() 和 doHelp() 方法。这样,由于 GenericPortlet 类帮助实现 render() 方法,并且提供 doView() 、 doEdit() 和 doHelp() 方法来覆盖,因此 GenericPortlet 类比 Portlet 接口更便于扩展。
3) 完成
当 portlet 的实例被撤销部署时,使用 destroy() 方法来释放这些资源。
?????? 使用 portlet 标签库允许我们在 JSP 中获取 portlet 特定的元素,例如 RenderRequest 对象和 RenderResponse 对象。还可以在 JSP 中生成 portlet URL 。在 JSP 页面中必须有类似下面的声明:
?????? <%@ taglib uri=”http://java.sun.com/portlet” prefix=”portlet” %>
?????? 在实际的应用场景中,我们经常需要把不同的应用程序集成在一个统一的用户界面上。 Portal 技术可以很好的解决这一问题,但需要开发一定数量的 portlets 。但有时我们需要把同一个 portlet 部署在不同的门户中,此时可能我们要费很大的力气重新为每个门户重新开发相同的 portlet 。有很多通用的 portlets 在升级应用服务器时不能很好的做到重用。此时我们怎么办?
?????? 我们只有遵循业界公认的标准,标准可以帮助我们减轻移植和互操作的带来的痛苦。随着门户标准 JSR168 和用于远程 Web 服务 portlet ( WSRP )的广泛采用,我们将能够很容易的做到重用和维护。
?????? 总的来讲,这些新标准正在给门户部署的本质带来根本性的变化,伴随而来的是门户开发商市场的剧变。越来越多的客户在根据门户的总体体系结构是否符合该企业来选择门户技术,而不是根据门户的一组专用的特性,例如 portlets 的数目来选择。
?????? 1) JSR168
?????? JSR168 规范为创建 portlets 建立了标准的 API 。它是为实现 portlet 、基于 Java 的门户服务器和其他 Web 应用程序之间的互操作性而设计的。现在大多数开源的和商用的 Portal 产品都支持 JSR168 。因此开发符合 JSR168 规范的 portlet 的客户可以很容易的将 portlets 从某一开发商的门户移到另一个开发商的门户中。此外,客户现在还可以使用迅速增长的开箱即用、符合标准的 portlets 。按照 Java 标准化组织( Java Community Process )所述, JSR168 portlet 拥有一个适用于所有门户客户端的简单的,标准的 API ,支持多种类型的客户端(多设备,多浏览器),支持本地化和国际化,允许门户应用程序的热部署和重新部署,并包含声明性安全(与 servlet 和 EJB 规范中使用的机制相同)。
?????? 2) WSRP
?????? 由 JSR168 标准获取的益处被 WSRP 进一步得到增强。 WSRP 是由 OASIS (一个由开发电子商务标准的行业专家所组成的非赢利性社团)创建,它使得开发的 portlets 可以被远程的门户展现出来。 WSRP 使原来极难实现的功能成为可能。例如,部署一次 portlet ,可以把它们传递到任何符合标准的门户中去;将第三方提供的 portlets 整合进自己的门户中,增强来自不同开发商的门户之间的互操作性。
?????? 在 JSR168 规范中只定义了 Portal 所应具有的功能的一个最小集合。然而在现实场景中,不论是开源的 portal 框架实现,还是商业 Portal 产品都在标准的基础上作了扩展。总的说来,一般 Portal 可能会包含以下功能,见表 3.1 :
功能 |
描述 |
内容聚合 |
能够把各种不同应用的内容聚合到一个统一的页面呈现给用户。 |
基于角色的视图定制 |
能够基于组织机构中不同的用户的角色生成不同的视图内容。例如,人力资源总监和财务经理登录后所看到的页面也是不同的。 |
个性化 |
用户能够根据个人喜好定制符合自己风格的页面和内容。例如,小王喜欢淡蓝色的格调,并且投资股票,则他可以选择一个淡蓝色风格的主题,并且使用一个已经定制好的股票 portlet ,允许小王设定此 portlet 的自动刷新时间和自选股等。 |
单点登录 |
只需登录 Portal 服务器一次就可以访问所有其它的应用,这意味着你无需再分别登录每一个应用。 |
协作功能 |
一些 Portal 框架可能会提供复杂的 portlets 用于聊天,应用程序共享,白板,在线会议,论坛等。 |
国际化 |
根据 locale 的不同呈现不同国家的文字。 |
工作流 |
这里主要指支持跨越不同数据源和应用的工作流。 |
支持不同的客户端 |
包括主流 web 浏览器, PDA 等。 |
表 3.1 Portal 功能
margin: 0c