理解Java Portal规范

时间:2022-12-07 03:39:54

近些年来,许多组织已经使用portal承载各种内部和外部的应用。许多知名的J2EEportal供应商针对这个利润丰厚的市场提供各自的产品。在过去,每个portal都定义了它们自己的专有API,用于在portal上构建portlet,应用组件。不幸的是,针对这么多的API进行编码,每个厂商都限制、锁定了门户开发者。现在JavaPortlet规范(JSR168)改变了这一切。

这个规范是由J2EE portal供应商委员会制定的,旨在实现portal和portlet之间的互操作性。供应商们都被要求通过SunMicrosystems' Technology Compatibility Kit,或TCK的一系列测试。这种标准化有助于简化portlet开发,是开发人员能够创建兼容任意J2EEportal服务器的可插入组件。

本文从portal,portlet和portlet容器的高级定义开始。之后,我们将重点介绍Javaportlet规范的最重要的部分。

portal,portlet和portlet容器

针对Java portlet规范进行开发,需要考虑三种逻辑组件。

一个portal是将portlet应用按照可见格式聚集在一起的一个应用程序。在表现层之上,一个portal通常允许用户定制他们的展示界面,包括显示什么样的portlet。门户也可以为用户提供方便的单点登录机制。

一个portlet就是一个单独的web组件,可以使用户通过portal界面进行访问。通常情况下,一个用户通过浏览器访问单个portlet只会生成一个标记片段。用户从portal页面向portlet发出请求。Portal将这些请求转发到portlet容器,它是负责管理portlet生命周期的。

Portlet容器介于一个portal和它的portlets之间。Portlet容器为portlets提供了运行时环境,就像servlet容易为servlets提供环境一样。Portlet容易通过调用portlets的生命周期方法对它们进行管理。容器将请求转发给相应的portlet。当一个portlet生成一个响应,portlet容易会将它发送到portal呈现给用户。一个用户的portal页面的事件的顺序如下所示。需要指出的是一个portal和portlet容器之间在逻辑上是一致的。它们可能就是一个物理组件。

理解Java Portal规范

当我们开始深入到Java Portlet规范的一些背后的概念,你就会看到它与J2EEservlets有许多相似之处。当你意识到portlet应用基本是都是从web应用扩展而来的,也就是servlets的上一层,那么这就可以理解了。因此,portlet开发者不仅可以访问portlet对象,而且可以访问底层的servlet结构。

Portlet的生命周期

如前所述,portlet容器的工作就是管理portlet的生命周期。每个portlet都公开了四个生命周期的方法。

init(PortletConfigconfig) 在一个新的portlet实例创建后立刻被调用一次。它可以被用于执行启动任务,类似于servlets的初始化方法。PortletConfig表示只读的配置数据,数据是在portlet的描述文件portlet.xml(之后会对此文件详细介绍)中定义 的。例如PortletConfig提供了初始化参数的访问。

processAction(ActionRequest request, ActionResponse response) 方法在用户操作响应中被调用,例如点击一个超链接或者提交一个表单。在这个方法中,一个portlet可以调用业务逻辑组件,例如JavaBeans以实现其目的。ActionRequest和ActionResponse方法是PortletRequest和PortalRequest的子接口。在processAction中,一个portlet可以修改自己的状态以及与portlet相关的持久化信息。

render(RenderRequest request, RenderResponse response) 方法在生命周期方法链中跟随processAction之后。渲染器生成portal用户访问的标记。RenderRequest 和RenderResponse方法是PortletRequest和PortalRequest的子接口,可以在一个portlet渲染的时候使用。 渲染方法的生成输出方式依赖于portlet的当前状态。

destroy() 方法是生命周期最后的方法,在一个portlet被垃圾收集之前调用,提供释放portlet资源的最后机会。


Portlet模式和窗口状态

一个portlet容器管理一个portlet的生命周期,但它也管理表现portlet状态的两种信息,portlet模式和窗口状态。

一个portlet模式决定了在一个portlet可以执行什么样的操作。查看,编辑和帮助是三种标准模式。也可以定义其他模式。

GenericPortlet类,可以在portlet.jar文件中找到,它是一个便于实现render方法和定义三种空方法doView,doEdit 和doHelp的类。, 你的GenericPortlet的子类可以根据你的需要实现这些方法。当容器调用render方法,render将会根据portlet模式调用这些方法中的一个。例如,doEdit可以准备一个HTML表单用于定制portlet。doView可以帮助生成显示标记,doHelp可以创建一个portlet的帮助界面。

窗口状态决定了有多少内容应该显示在portlet中。规范中定义了三个标准的窗口状态:Normal,Minimized和Maximized。Normal将会在portal应用定义的窗口空间中显示portlet的数据,Maximized只会在portlet处于用户的窗口中才显示,Minimized可能只显示一行文字或者什么都没有。

窗口状态和portlet模式可以在一个portlet应用的生命中通过程序访问。他们可以从任意portlet API方法读取,例如render。一个portlet的processAction可以修改它们的值。

PortletPreferences和PortletSession

该规范定义了一些用于存储用户信息的不同方法,可以是持久的或者用户会话级长度。最重要的两个就是PortletPreferences和PortletSession。

PortletPreferences是一个用于存储一个portlet用户的持久化数据的对象。PortletPreferences使用名值对进行存储,这样厂商可以通过调用getValue方法进行检索。processAction中,可以通过setValue和store方法分别设置和保存值。或者你可能包含了一个PreferencesValidator对象用于在持久化preferences之前检查值(通过它的validate方法)。默认preference值可以在portlet描述文件中进行定义。

在servlet编程中,HttpSession会让你保存特定的会话数据。此外,Java Portlet规范定义了PortletSession接口用于在一个用户会话中存储信息。PortletSession确定了两个范围,PORTLET_SCOPE和APPLICATION_SCOPE。在portlet会话范围内,你可以在一个用户会话中具体到单个的portlet实例存储数据。应用会话范围可以在同一个会话中跨一个用户的所有portlet存储数据。

其他重要的功能

下面是Java Portlet规范定义的一些附加功能的一个列表。

  • 一个将servlets和JSP页面纳入你的portlets的包含机制。一个PortletRequestDistpacher实现了这一点,它和servlet中的RequestDispatcher几乎一样。这使得你的portlet方法可以作为控制器,重定向到指定的servlet和JSP。
  • 创建一个非标准的portlet扩展的方式,例如自定义portlet模式。PortalContext对象可以被用于查询有关portal厂商的支持扩展的信息。然后portlet开发者可以决定他们是否想使用这些非标准功能的优势。 
  • 一个taglib可以在portlet的JSP页面中使用。这些标签提供了构建URLs portlet所需要的指回本身的方法。taglib也提供了包含一个JSP所需要的所有特定的portlet类。
  • 管理portlet安全性的能力,例如制定一个portlet只能通过HTTPS运行。
  • 访问ResourceBundles的方法,以实现portlet本地化。
  • 声明指定一个portlet过期缓存选项。

 此外,当讨论Java Portlet规范时,也会提及与它相关的另一个标准,Web Services for Remote Portlets,也叫做WSRP。WSRP是一个由远程portlet生成的用于访问内容的标准,portlet可能会使用J2EE之外的技术。虽然它们是单独的规范,但是Java Portlet规范和WSRP都考虑到对方的标准进行开发。所以,两个规范共享了许多相同的概念,如portlet模式和窗口状态,允许一个portal有效地使用这两者。

把一个Java Portlet打包

Java Portlet规范允许一个或多个portlet打包为一个.war文件,这样可以部署在一个J2EE应用服务器。就像一个.war文件被部署为一个典型的J2EE web应用,它包含一个 WEB-INF/web.xml文件用来配置应用的上下文。然而,一个portlet应用中,WEB-INF文件夹还必须包含一个portlet.xml文件。这个portlet.xml是一个描述文库,包含了.war文件中所有捆绑的portlet配置细节。

下面的列表展示了一个portlet.xml的简单例子。请留意先前描述的结构体(portlet模式,preferences等等)有多少是在这个文件中定义的。

一个portlet.xml例子

<portlet-app>
	<portlet>
		<portlet-name>MyPortlet</portlet-name>
		<portlet-class>com.abc.portlet.MyPortlet</portlet-class>
		<init-param>
			--Init param, available in portlet'sPortletConfig instance.
			<name>
				view-to-present
				<value>/portlet/MyPortlet/startup_view.jsp</value>
		</init-param>
		<expiration-cache>300</expiration-cache>
		--Defaultexpiration for portlet cache (5 minutes)
		<supports>
			<mime-type>text/html</mime-type>
			--Portlet supports HTML markup
			<portlet-mode>VIEW</portlet-mode>
			--MyPortlet supports modes view andedit
			<portlet-mode>EDIT</portlet-mode>
		</supports>
		<resource-bundle>com.abc.portlet.MyResourceBundle</resource-bundle>
		<portlet-preferences>
			<preference>
				<name>Country1</name>
				--PortletPreferences name/valuepairs.
				<value>USA</value>
			</preference>
			<preference>
				<name>Country2</name>
				<value>Japan</value>
			</preference>
			--APreferencesValidator will check any preferences set.
			<preferences-validator>com.abc.portlet.validate.CountryValidator
			</preferences-validator>
		</portlet-preferences>
	</portlet>
</portlet-app> 


总结

Java Portlet规范已经被不少商业和开源厂商广泛蚕蛹。展望未来,portlet开发者可以使用这个标准的优势,从而确保许多不同的portal之间的兼容性。 

原文地址:http://www.developer.com/java/web/article.php/3366111/Understanding-the-Java-Portlet-Specification.htm