-
Portal
是什么?
在了解
portlet
之前有必要先了解
po
rtal
。在
Portlet
规范里是
这样讲的:“
portal
是一种
we
b
应用,通常用来提供个性化、单次登录、聚集各个信息源的内容,并作为信息
系统表现层的宿主。聚集是指将来自各个信息源的内容集成到一个
web
页面里的活动”。
Portal
的功能可以分为三个主要方面:
1.
Por
tlet
容器:
Portlet
容器与
servlet
容器非常类似,
所有的
portlet
都部署在
portle
t
容器里,
portlet
容器控制<
/p>
portlet
的生命周期并为其提供必要的资源和环境信息。<
/p>
Portlet
容器负责初始化和销毁
p
ortlets
,向
portlets
传送用户请求并合成响应。
2.
内容聚集:
Portlet
规范中规定
portal
的主要工作之一是聚集由各种
portlet
应
用生成的内容,我们将在“如何创建
Portal
页面”部分对此做进一步讨论。
3.
公共服
务:
portlet
服务器的一个强项是它所提供的一套公共服
务。这些服务并
不是
portlet
规
范所要求的,但
portal
的商业实现版本提供了丰富的公共
服务以有别于它
们的竞争者。在大部分实现中都有望找到的几个公共服务有:
o
单次
登录:
只需登录
portal
服务器一
次就可以访问所有其它的应用,
这意味着
你无需再分别登录每一
个应用。例如一旦我登录了我的
intranet
网站,我就能
访问
mail
应用、
IM
消息应用和其它的
intranet
应用,不必再分
别登录这些应用。
Portal
服务器会为你分配一个通行证库。
你只
需要在
mail
应用里设定一次用户名和密
码,这些信息将以加密的方式存储在通行证库中。在你已登录到
intranet<
/p>
网站并要访问
mail
应用的时候,
p>
portal
服务器会从通行证库中读取你的通行证替你登录到
p>
mail
服务器
上。你对其它应用的访问也
将照此处理。
p>
o
个性化:个性化服务的基本实现使用户能从两方面个性化她的页面
:第一,用
户可以根据她的自身喜好决定标题条的颜色和控制图标。
第二,
用户可以决定在她的页面上
有哪些
< br>portlets
。例如,如果我是个体育迷,我可能会用一个能提供我钟爱球队
最新信息
的
portlet
来取代股票
和新闻
portlets
。
p>
一些在个性化服务方面领先的商业实现版本允许你建立为用户显示什么样的应
用所依据的标准(如收入和兴趣)。在这种情况下,可以设定一些像“对任何收入为
X
的
用户显示馈赠商品的
port
let
”和“对任何收入为
X
的用户显
示打折商品的
portlet
”这样
的
商业规则。
此外还
有一些公共服务,比如机器翻译,是由
portal
服务器将<
/p>
portlet
生成的
内容翻译为用户要
求的语言。大部分的商业
portal
服务器都支持手持设备访
问并具有针对
不同的浏览终端生成不同内容的能力。
Portlets
是什么?
与
p>
servlets
类似,
portlets
是部署在容器内用来生成动态内容的
web
组件。
从技术角
度讲
portle
t
是一个实现了
t
接口的类,
它被打包成
war
文件格式部
< br>署到
portlet
容器里。
Por
tlets
在以下方面与
servlets
相似:
1.
portlets
由特定的容器管理。
2.
portlets
生成动态内容。
3.
p>
portlet
的生命周期由容器管理。
4.
p>
portlets
通过请求
/
响应模式与
web
客户端交互。
Portlets
在以下方面与
servlets
相异:
1.
portlets
只能生成标记段,而不是整个文档。
2.
por
tlets
没有可供直接访问的
URL
地址。不过你还是能够让别人通过
URL
访
问到
portlet
,你可以把包含该
portlet
的页面的
URL
发
给他。
3.
portlets
不能随意地生成内容,
这是因为
portlet
生成的内容最终要成为
portal
页面的一
部分。
如果
portal
服务器要求的
是
html/text
类型,
那么所有
的
portlets
都应生
成
html/text
类型的内容。再比方说,如果
portal
服务器要求的是
WML
类型,那么所有
的
portlets
都
应生成
WML
类型的内容。
por
tlets
还提供了一些附加的功能:
1.
p>
设置参数的持久化存储:
portlets
提供了一个
PortletPreferences
对象用来保
存用户的设置参数。这些参数被存入一个持久化数据库,这样服务器重启后数据依然有效
。
开发者不必关心这些数据存储的具体实现机制。
2.
p>
请求处理:
portlets
提供了更为细
粒度的请求处理。
对于用户在
portlet
< br>上动作
时向该
portlet
发
出的请求
(
一种称为活跃期的状态
)<
/p>
,或者因用户在其它
portlet
上动
作而
引发的刷新页面请求,
Portal
服务器提供了两种不同的回调方法来处理。
3.
Por
tlet
模式:
portlets
用模
式的概念来表示用户在做什么。在使用
mail
应用
的时候,你可能会用它来读信、写信或检查信件――这些都是
mail
p>
应用的预定功能,
Portlets
通常以
VIEW
模式提供这些功能。但还有一些活动,像指定刷新时间
或(重新)
设置用户名和密码,
这些活动允许用户定制应用的行
为,
因此它们用的是
EDIT
模式。<
/p>
Mail
应用的帮助功能用的是
HELP
模式。
如果仔细想想其实这里面并没有什么新东西,它们反而大部分
都是普通的业务需求。
Portlet
规范的作用在于它提供了
一个抽象层,这才是它对所有与之相关的人-最终用户、
开发者和管理员-的价值所在。
p>
作为一个开发者,
我会将所有与
VIEW<
/p>
模式有关的业务逻辑放入
doView()
方法,
将与
应用配置有关的业务逻辑放入
doEdit()
方法,将与帮助有关的逻辑放入
doHe
lp()
方法
这就简化了管理员对
portlet
应用的访问控制管理,因为他只需改变
portlet
的访问权
限就能决定用户能做什么。例如,如
果
mail
应用的一个用户能够在
ED
IT
模式下设定用户
名和密码,那么就可以断定他具有
EDIT
模式访问权限。
不妨考
虑这样一种情形:我是一个
intranet
网站的管理员,我
的公司买了一个能显示
新闻信息的第三方
portlet
应用,该应用允许用户指定跟踪新闻更新的
URL
地址,我想借
助它为用户显示公司的内部新闻。
另一个需求
是我不想让用户通过该应用来跟踪任何其它的
新闻信息来源。
作
为管理员,
我可以为所有的用户指定一个用于内部新闻更新的
U
RL
地址,
同时通过改变
portle
t
应用的部署描述符来取消其它人修改该地址的权限。
由于所
有的
portlet
应用都具有相似的
UI
界面,
因此采用
portlets
可使网站对最终用
户更具吸引力。
如果
她想阅读任何一个应用的帮助信息,
她可以点击帮助按钮;
她也
知道点
击编辑按钮能让她进入应用的配置屏。标准化的用户界面使你的
< br>portlet
应用更引人。
4.
p>
窗口状态:窗口状态决定了
portal
页
面上留给
portlet
生成内容的空间。如果
点击最大化按钮,
portlet
将占据整个屏幕,成
为用户唯一可用的
portlet
;而在最小化状
态,
portlet
只显示为标题条。作为开发者应
当根据可用空间的大小来定做内容。
5.
p>
用户信息:通常
portlets
向发出请
求的用户提供个性化的内容,为了能更加行
之有效,
portl
ets
需要访问用户的属性信息,如姓名、
email
、电话等。
Portlet
API
为此
提供了用户属性的概念,
开发者能够用标准的
方式访问这些属性,
并由管理员负责在这些属
性与真实的用户信
息数据库(通常是
LDAP
服务器)之间建立映射关系。
我们将在本文的第二部分深入讨论这些特点-请求处理、用户信息和
por
tlet
模式。
开发
现在我们就来开发一个简单的
HelloWorld
portlet
。
1.
创建一个名为
HelloWorld
的
web
项目,它与通常的
servlet
项目类似,
有一个
/WEB-
INF/
文件作为项目的部署描述符。
2.
在
build path
里加入
文件,
该
jar
p>
文件是
Pluto
发行包的一部分。
3.
在
Source
文件夹中按如下内容创建
p>
文件:
public class HelloWorld extends
GenericPortlet{
protected
void
doView(RenderRequest
request,
RenderResponse
response)
throws
PortletException,
IOException
{
tentType(
ter().println(
}}
每个
portlet
都要实现
Portlet
接口,该接口为
portlet
定义了生命周期方法。
由于不想覆盖
所有这些方法,我们只对
GenericPortlet
类进行
扩展,
它是一个实现了
Portle
t
接口的适配器类。
GenericPortlet
类提供了所有生命周期方法的
默认实现,
所以我们只需实现我们所需要的方法。
我们在
HelloWorld
portlet
里要做的只是显示“
Hello
Portlet
”,
所以我们将覆盖
GenericPortlet
类的
d
oView()
方法,该方法以
PortletRequest
和
PortletResponse
作为参数。
在
doView()
方法中首先调用
tentType()
p>
以通知
portlet
容器该
portlet
将要生成何种
类型的内容-如果不这样做就会导致
IllegalStateException
异常。
一旦设置了内容的类型,就可
以从
response
对象中获得
Pr
intWriter
并开始写入。
4.
每
个
portlet
应用在
/WEB-I
NF
文件夹中都有一个
文件,