By
Terry. Lee
SpiritSeekerS@sqatester.com
本系列将介绍如何开发基于
Portlet Specification v1.0 (JSR168)
的
Portlet
应用程序以及相关的概念. 这里使用
Pluto v1.0
作为
Portal/Portlet Container
.
并且可以将开发完成的
Portlet
应用程序发布到任何遵循
JSR168
规范的其他
Portlet Container
和
Portal Server
上.
·
为什么要发布
Portlet Specification
?
什么是
JSR168
?
越来越多的公司开发了各自的
Portal
组件和基于其的
Portal
产品(如
Bea, IBM, Oracle, Sun, Sybase, Vignette, Novell, SAP, Plumtree
, Apache
等.
这种互不兼容的接口实现带给软件开发商以及Web开发人员各种问题, 为了解决这些问题,
JCP
发布了
JSP168 (Java Specification Request), Portlet Specification v1.0,
用以提供不同
Portal
和
Portlets
的实现
之间的互通性.可能许多软件开发商 (如上所列) 提供更为强大的
Portlet
实现, 但是如果希望开发人员希望所开发的
Portlet
程序
能够不依赖于某一种或者几种平台, 那么使用
JSR168 Portlet
毫无疑问是你的首选.
·
什么是
Portal?
Portal
是基于
WEB
的应用程序, 一个信息平台, 它将不同来源的各种资源进行整合并集中展现给客户.
通常其有如下三个特点:
a.
P
ersonalization (
个性化
)
b.
Single sign on
(
单点登陆
)
c.
Content aggregation (
内容聚合
)
Personalization
是
Portal
提供的特性之一
,
用来提供用户的个性化设置
.
Single sign on
是
J2EE
的一个特性
.
其中
Content aggregation
是
Portal
比较有特色的特性
,
它将不同来源的信息整合到一个同一个页面中
,
使得用户可以更便捷
,
更快速的进行某些商业应用
.
这里举一个简单的商业应用的例子
,
如果某一客户需要进行一次商业采购行为
,
以往需要访问不同的产品供应商的主页得到相关信息
,
这往往是一个耗时耗力的过程
,
但如果使用
Portal
将所有经常使用的相关商品供应商的商品
浏
页面都整合到一个
Portal
页面中
,
那么所有的供应商的商品都可以更快的被浏览
,
筛选
,
加快了客户的商业运作效率
.
·
什么是
Portlet?
Portlet
是一种基于
WEB
组件的
JAVA
技术, 由
Portlet Container
进行管理. 处理请求并动态返回页面, 可以作为
Portal
的可
即插即用
的界面组件.
·
什么是
Portlet Container? Portlet Container
用来管理
Portlet
的生命周期并且提供其运行所需要的必要环境. 并且给
Portlet Preferences
提供持久性(
Persistent
)
存取服务.但是其不支持
Portlet
的
aggregation(
内容聚合
).
内容聚合
由
Portal
组件提供.这个概念需要弄清楚.
注:
Portlet Preferences
是
Portlet
的一个新特性,提供类似数据库的功能.但是不是用来取代数据库. 只能用来存取简单的
Portlet
配置参数.
·
什么是
WSRP?
WSRP
是
OASIS Web Service for Remote Portlets
的缩写
. WSRP
是
Web service
的一种新的商业应用
,
一种新的标准
,
主要用来简化
Portal
对于各种资源或者程序整合的复杂性
,
可以避免编程带来的整合麻烦和问题
.
而且
Portal
的管理员可以从海量的
WSRP
服务中选择需要的功能用以整和到目前使用的
Portal
中
.
它有三种
Roles:
1) Producer ->
提供
Portlet
2) Consumer ->
使用
Portlet
3) End User ->
最终用户
它的特点在于
Producer
将
Consumer
所需要的信息通过
WSRP
返回给
Consumer,
这些信息是相对的标记
Fragment(
片段
),
例如
HTML,XHTML
等
,
直接可以镶入用户的
Page
中
,
而不用象
Web service
一样需要单独开发用户端接口
.
再举个
WSRP
的商业应用的例子:
如果一个
客户需要采购一些
PC
软件
,
那么这个客户通过互联网登陆某家
PC
软件
代理供应商的网页
,
查询相关信息
,
但是做为
软件
代理公司
,PC
软件的高级使用指南及配置工具是非常缺乏或者是无法及时更新的
,
这样一来使得用户需要登陆软件开发商的站点上才能得到相关信息
.
然后再回到代理商主页进行订购
.
而比较理想的商业应用应该是代理公司可以整合软件开发商提供的使用指南或者配置工具
(
可以由开发商及时更新
).
但是如果使用
XML API,
那么需要针对不同软件提供商开发不同的接口实现
.
而使用
WSRP
可以将相关的信息及工具直接镶入到代理商的页面用以动态
,
及时提供给客户
.
WSRP4J
是
Apache
的
WSRP
标准实现
,
请参考文章末尾的资源部分.
·
Portlet and Servlet
比较
摘自
(Portlet Specs v1.0)
相同点:
Portlets are Java technology based web components
Portlets are managed by a specialized container
Portlets generate dynamic content
Portlets lifecycle is managed by a container
Portlets interact with web client via a request/response paradigm
不同点
:
Portlets only generate markup fragments, not complete documents. The Portal aggregates portlet markup fragments into a complete portal page
Portlets are not directly bound to a URL
Web clients interact with portlets through a portal system
Portlets have a more refined request handling, action requests and render requests
Portlets have predefined portlet modes and window states that indicate the function the portlet is performing and the amount of real state in the portal page
Portlets can exist many times in a portal page
Portlet
特有
:
Portlets have means for accessing and storing persistent configuration and customization data
Portlets have access to user profile information
Portlets have URL rewriting functions for creating hyperlinks within their content, which allow portal server agnostic creation of links and actions in page fragments
Portlets can store transient data in the portlet session in two different scopes: the application-wide scope and the portlet private scope
Servlet
特有
:
Setting the character set encoding of the response
Setting HTTP headers on the response
The URL of the client request to the portal
·
什么是
Pluto
?
Pluto
是
Apache
的一个
Open Source
项目
,
是基于
Portlet Spec (v1.0) (JSR168)
的一个
Portlet Container
的实现
.
它也提供了
一个演示版的
Sample
Portal
实现
,
用以进行
Portlet Container
的
测试
.
但是功能相对简单
:
例如
,
1)
没有复杂的
Layout
实现
.
2)
不是
multi
-user enabled
,
比如
,
不同
User
之间的
Portlet Preferences
互相是
可以
share
的
.
请记住
Pluto
只是一个
Portlet Container
的实现
,
不是一个
Portal
的实现
.
如果你需要功能更为强大的
Portal
,
可以使用
JetSpeed
或者其他功能更强大的
Portal
,
它同样也是
Apache
的一个
Open Source Project
.
请参考文章末尾的资源部分
.
·
概念
如图
:
Figure 1.1
a.
Decorations and controls (
修
饰
部分
及 控制
部分
)
b.
Portlet fragment
(Portlet
片段
)
c.
Portlet window (Portlet
窗口
)
d.
Portlet page (Portlet
页面
)
Figure 1.1
·
开发工具
( Eclipse2.1, Pluto-plugin, Jakarta-tomcat-4.1.29)
下载地址
:
Eclipse
http://www.eclipse.org/downloads/index.php
Pluto-plugin
http://prdownloads.sourceforge.net/plutoeclipse/org.eclipsefan.pluto.ui_1.0.0.zip?download
Tomcat4.1
http://mirrors.midco.net/pub/apache.org/jakarta/tomcat-4/v4.1.29/bin/jakarta-tomcat-4.1.29.zip
JDK1.4
http://Java.sun.com
·
配置开发环境
Step1 :
解压
eclipse-SDK-2.1.1-win32.zip
Step2 :
解压
org.eclipsefan.pluto.ui_1.0.0.zip ,
并将其拷入
eclipse\plugins
目录
下
,
如下
: eclipse\plugins\org.eclipsefan.pluto.ui_1.0.0\
\Icon
\Lib
\Source
\Webapp
…
Step3 :
解压
tomat4.1
到一目录
.
并且配置好
Tomcat
服务器
.
配置完成
.
a.
使用
Portlet Wizard
来创建
Portal
1)
选择
File > New > Project… > Portal > Pluto Portal application,
单
击
Next
,
如图
:
Figure 1.2
2)
指定
Project
名称
(
如图
1.3),
这里使用
pluto
,
然后单击
Next
.
Figure 1.3
3)
指定
Tomcat
路径
,
单击
Finish
.
之
后
eclipse
会将
Pluto
安装到
tomcat
上
,
并且自动配置好环境
.
Figure 1.4
b.
创建
Portlets Application
1)
创建
Pluto portlet application
(
如图
Figure 1.5
)
Figure 1.5
2)
输入
project
名称
(
如图
Figure 1.6
),
这里用
portlets
Figure 1.6
c.
最后生成的工程如图
(
Figure 1.7
):
.
Figure 1.7
d.
通过
portlet.xml
生成
/
更新
web.xml
(
如图
Figure 1.8)
注
:
如果每次对
Portlet.xml
文件进行修改后
,
比如添加新的
Portlet ,
必须更新
web.xml ,
生成对应的
Wrap Servlet ,
否则
Portlet
无法在
Portal
中加载
.
Figure 1.8
e.
部署
Portlets
1)
编译
portlets
工程
.
2)
在
[your tomcat installation directory]/webapps
下,
新建目录
portlets
3)
将
portlets
工程下的
web-root
目录下所有文件
,
拷入以上新建的
portlets
目录中
.
Tip:
如果在每次修改后你厌倦了
Ctrl+C
和
Ctrl+V,
你可以在
Portlets
工程目录下自己编一个
Bat
文件
,
然后你可以在
eclipse
里的
Package Explorer
中看到它
,
双击就可以了
.
如上图
(
Figure 1.8
):
其中
deploy.bat
文件就是实现
Deploy
的
.
4)
Start tomcat.
5)
在
IE
中输入
:
http://localhost: 8080/pluto/portal
,
你应该能看到
portal
页面.
·
Sample Portlet
在
Portlets
工程文件创建过程中
,
自动生成许多文件
,
包括一个简单的
Portlet
小程序
,
现在我们来简单观察一下生成的
sample
portlet.
1)
与
Servlet
非常类似
,
Portlet
扩展自
GenericPortlet
import
javax.portlet.*;
public
class
SimplePortlet
extends
GenericPortlet
2)
其三个方法对应了
Portlet
标题栏中的三个
链
接
(View, Edit, Help)
所执行的功能
.
public
void
doView(
…)
public
void
doEdit(
…)
public
void
doHelp(
…)
3)
三个方法分别调用了三个
JSP
文件
,
用以生成
Portlet fragment
,
同样也可以调用
Servlet
产生
Portlet fragment
,
或者不调用
JSP
或者
Servlet,
直接在方法中得到
PrintWriter,
用最简单的
pw.println(…)
打印出内容
,
类似
Servlet,
如下
:
PrintWriter pw=renderResponse.getWriter();
pw.println(
"
Hello, Portlet!
"
);
与
Servlet
应用类似
,
也可以使用
getInitParameter
(String s)
方法
,
得到配置文件中
Portlet
的初始值
.
只不过
Servlet
使用
web.xml
,
而
Portlet
使用
portlet.xml
文件
.
portlet.xml
<init-param>
<name>jspView</name>
<value>/jsp/view.jsp</value>
</init-param>
SimplePortlet.java
String
jspName
=
getPortletConfig().getInitParameter(
"jspView"
);
·
Portlet Tag library
1)
defineObjects Tag
如果打开其中的一个JSP文件,你会发现,和Servlet一样,JSP中可以使用Portlet的一些
variables
.
例如:
renderResponse
renderRequest
portletConfig
但是必须声名
:
<portlet:defineObjects/>
其中不可以定义任何属性或者包含任何内容
.
2)
actionURL Tag
属性
|
值类型
|
对应值
|
windowState
|
String
|
minimized
normal
maximized
.
|
portletMode
|
String
|
view, edit , help
|
var
|
String
|
|
secure
|
String
|
true
false
|
<portlet:actionURL windowState=”normal” portletMode=”edit”>
<portlet:param name=”action” value=”login”/>
</portlet:actionURL>
创建一个
action URL ,
当访问它时将使
portlet window
变为
normal
装态
,
模式变为
edit.
3)
renderURL Tag
属性
|
值类型
|
对应值
|
windowState
|
String
|
minimized
normal
maximized
.
|
portletMode
|
String
|
view, edit , help
|
var
|
String
|
|
secure
|
String
|
true
false
|
<portlet:renderURL portletMode=”view” windowState=”maximized”>
<portlet:param name=”number” value=”1”/>
<portlet:param name=”page” value=”2”/>
</portlet:renderURL>
创建一个
render URL ,
当访问它时将使
portlet window
变为
maximized
装态
,
模式变为
view.
4)
namespace Tag
为目前的
Portlet
产生一个唯一的
Value.
防止和其他的
Portlet
或者
Portal
页面上的
value
产生冲突
.
<A HREF=”javascript: <portlet:namespace/>doFoo()”>Foo</A>
5)
param Tag
<portlet:param name=”myParam” value=”someValue”/>
注
: param Tag
不可以有
body content.
总结
Pluto
目前是
v1.0
,
有部分
Portlet
规范
没有完全实现
,
例如
,
renderResponse.setTitle (),
同时
你可以从
Apache
的
CVS
下载最新的
Pluto
代码
,
希望这编文章可以帮大家搭建一个简单的
Portlet
开发环境
,
熟悉
Portlet
相关的知识
.
资源
:
·
Pluto
http://jakarta.apache.org/pluto
·
Pluto Mail List
http://news.gmane.org/gmane.comp.jakarta.pluto.user
·
WSRP Spec1.0
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrp
·
Apache
的
WSRP
实现
(WSRP4J)
http://ws.apache.org/wsrp4j/
·
Apache’s Portal, JetSpeed:
http://jakarta.apache.org/jetspeed/site/index.html
·
JSR 168:
http://www.jcp.org/en/jsr/detail?id=168
·
"Portlet
规范介绍
" By Stefan Hepper
和
Stephan Hesmer