当前位置: 代码迷 >> JavaScript >> JSR168 Portlet轨范的中文版 【四】 PLT. 5
  详细解决方案

JSR168 Portlet轨范的中文版 【四】 PLT. 5

热度:451   发布时间:2012-11-16 14:12:15.0
JSR168 Portlet规范的中文版 【四】 PLT. 5
PLT. 5


?

?Portlet 接口

?

Portlet接口是Portlet API的主要抽象。所有Portlet都是或者直接实现此接口,或者更多地是继承实现了此接口的类。

?

本Porlet API包括一个实现了Portlet接口的GenericPortlet类,此类可以提供默认功能。开发者应直接或间接地继承此GenericPortlet类来实现他们的Portlet。

?

PLT. 5.1 Portlet实例数量

?

在Portlet应用的部署描述符中的Portlet定义部分是用来控制Portlet容器如何创建Portlet实例的。

?

对于一个不是在分布环境(默认的)中的Portlet,Portlet容器必须实例化并每个Portlet定义只使用一个Portlet对象。

?

如果将Portlet作为一个标记为分布式的Portlet应用的一部分来部署,在web.xml部署描述符文件中,Portlet容器,在一个虚拟机中(VM)中的一个部署描述符中,一个Portlet定义只能实例化一个Portlet对象。

?

PLT. 5.2 Portlet生命周期

?

Portlet是通过精心定义的生命周期来进行管理。它可以定义Portlet怎么被载入、实例化与初始化,如何处理客户端的请求,以及如何退出服务。Portlet的生命周期是通过Portlet接口的init、processAction、render和destroy四个方法来表述的。

?

PLT. 5.2.1 载入与实例化

?

Portlet容器负责载入与实例化Portlet。载入与实例化是发生在Portlet容器启动Portlet应用,或延迟到Portlet容器决定Portlet需要为请求提供服务时。

?

Portlet容器必须使用用于载入Portlet应用其它Web应用的类载入器来载入Portlet类。载入Portlet类后,Portlet容器会对它们进行实例化以供使用。

?

PLT. 5.2.2 初始化

?

在Portlet对象被实例化后,Portlet容器必须在调用Portlet来处理请求前,将Portlet进行初始化。初始化是用来对初始化一些高耗资源(像端后连接),和运行一些一次性的行为。Portlet容器必须通过传入实现了PortletConfig接口的唯一(每个Portlet定义)对象调用init方法来初始化Portlet对象。该配置对象可以提供访问初始化参数和在部署描述符中的Portlet定义部分定义的ResourceBundle的接口。请参考“PLT.6 Portlet配置”章了解有关PortletConfig接口的信息。该配置对象也为Portlet提供了访问用来描述Portlet运行环境的上下文对象的接口。请参考“PLT.10 Portlet上下文”章了解有关PortletContext接口的信息。

?

PLT. 5.2.2.1 初始化时的错误条件

?

在初始化过程中,Portlet对象可能会抛出UnavailableException或PortletException的异常。在这种情况下,Portlet容器不必将Portlet对象放置到活动服务状态,而必须释放该Portlet对象。这时,无需调用destroy方法,因为这种情况会视初始化未成功。

?

初始化时抛出的RuntimeException会被作为PortletException来处理。

?

PLT. 5.2.2.2 工具的考虑

?

通过载入工具并对Portlet应用进行内部分析的方式来触发静态初始化方法与调用init方法是不同的。开发者在Portlet接口的init没有被调用之前,不能将Portlet看成是在Portlet容器中运行且活动的。比如,在发生静态(类)初始化时,Portlet不应该尝试建立与数据库或JavaBean容器的连接。

?

PLT. 5.2.3 Portlet窗口

?

Portlet定义可以包含一些具有默认值的首选项属性。它们是用来创建首选项对象(见“PLT.14 Portlet” 首选项章)。

?

运行时服务一个请求,Portlet对象会与一个首选项属性进行关联。一般地,Portlet自定义它的行为与生成内容都是基于与之关联的首选项对象的属性。Portlet可以编辑、修改和添加此首选项属性。

?

默认情况下,首选项对象是利用定义在Portlet部署描述符文件中的初始化首选项值来构建的。Portal或Portlet容器的实现可以提供基于已存在的首选项对象创建新的首选项对象的管理方式。Portal或Portlet容器创建的首选项对象可以进一步自定义它们的属性。

?

在将一个Portlet放置进一个Portal页面里时,一个首选项对象也会与之关联。在Portal页面上,Portlet和首选项对象所生成的事物被称作Portlet窗口。Portal或Portlet容器的实现管理此关联。

?

一个Portal页面可以包含多个引用于同一个Portlet及首选项对象的Portlet窗口。

首选项对象的操作、管理与配置和Portlet窗口的创建是通过Portal或Portlet容器的实现来进行。该实现也可以提供其它高级特征,如首选项对象的分线管理或首选项属性的级联变更。

?

PLT. 5.2.4 请求的处理

?

在Portlet被正确初始化后,Portlet容器会调用Portlet来处理客户端请求。

?

此Portlet接口定义了两个方法来处理请求:processAction方法和render方法。

?

当Portal或Portlet容器调用Portlet的processAction方法时,此Portlet请求是一个动作请求。而当Portal或Portlet容器调用Portlet的render方法时,此Portlet请求是一个渲染请求。

?

一般地,客户端的请求是通过Portlet生成的URLs来触发的。这些URLs可以被称作Portlet URLs。一个Portlet URL是指向一个特定的Portlet。Portlet URLs可以被分成两种:动作URLs和渲染URLs。请参考“PLT.7 Portlet URLs”章了解有关Portlet URLs的信息。

?

?正常地,就Portal页面上的一个Portlet而言,被动作URL触发的客户端请求,可以被翻译成一个动作请求和许多渲染请求;而被渲染URL触发的客户端请求,则只被翻译成许多渲染请求。

?

如果客户端请求被动作URL触发,Portal或Portlet容器会首先通过调用目标Portlet的processAction方法来触发动作请求。Portal或Portlet容器必须等到动作请求完成。然后,Portal或Portlet容器必须通过调用Portal页面上所有Portlets的render方法来触发渲染请求,同时还需要处理内容已被缓存的Portlet的可能异常。渲染请求会被有顺序地或没有保证顺序地平行执行。

?

?

如果客户端请求被渲染URL触发,Portal或Portlet容器必须通过调用Portal页面上所有Portlets的render方法来触发渲染请求,同时还需要处理内容已被缓存的Portlet的可能异常。渲染请求会被依次地或同时地执行。而Portal或Portlet容器无须为此客户端请调用Portal页面上任一Portlet的processAction方法。

?

如果Portlet开启缓存功能,Portal或Portlet容器可选择不去调用render方法。而Portal或Portlet容器可使用此Portlet的缓存内容。请参考“PLT.18 缓存”章了解有关Portlet 缓存的信息。

?

被设置为服务状态的Portlet,如在生命周期中如果没有处理任何请求,可以自行结束。

?

?PLT. 5.2.4.1 动作请求

?

代表性地,在对动作请求的响应中,Portlet会根据在动作请求参数中发过来的信息来更新状态。

?

Portlet接口的processAction方法接收两个参数:ActionRequest和ActionResponse。

?

ActionRequest对象提供对诸如动作请求参数、窗口状态、Portlet模式、Portal上下文、Portlet会话和Portlet首选项数据之类信息的访问途径。

?

在处理一个动作请求时,Portlet会引导Portal或Portlet容器为用户重定向到一个指定的URL。如果Portlet发出重定向命令,而当processAction方法结束时,Portal或Portlet容器必须将重定向命令发回给用户代理并必须结束对客户端请求的处理。

?

Portlet在收到动作请求时可以改变它的Portlet模式和窗口状态。这是通过ActionRepsonse对象来实现的。改变后的Portlet模式必须对Portlet之后接收到的渲染请求有效。