秋风清,秋月明,落叶聚还散,寒鸦栖复惊。
Portlet学习笔记
1. Portal基础
1.1. 什么是Portal
]s-e r d3S&j:h O
Portal 一词是在Internet 的发展中提出来的,原意为“门户网站”即是人们上网后想要访问的第一个网站,例如雅虎、搜狐这类网站。在这个阶段,Portal 还是作为一个面向广泛群体的信息平台,把人们所需要的各种信息(或者访问这类信息的途径)聚合在一起,是一个信息集中平台。很快企业应用中也开始采用Portal 这个概念,根据Portal 在企业应用中的不同作用,业界对Portal 有着不同的定义如企业信息门户、知识门户、专业门户、应用门户等等。随着时间的推移,业界对Portal 的定义趋向一致,也就是在JSR168 种对Portal 的定义:y I S-|{
portal爱好者
_ H |p.N F J h
A portal is a web based application that ?commonly- provides personalization, single sign on, content aggregation from different sources and hosts the presentation layer of Information Systems. Aggregation is the action of integrating content from different sources within a web page. A portal may have sophisticated personalization features to provide customized content to users. Portal pages may have different set of portlets creating content for different users.
https://www.wendangku.net/doc/3f12459320.html, T1Z(_1G'r o c,l
从上述定义中我们可以知道Portal 是企业用户访问各种企业信息、应用的入口,如下图:
o
o"M
].|T*U
1.2. 什么是Portlet
作为企业信息、应用的入口,Portal 的每个页面(Page )包含了多种不同的信息,一般来说Portal 的显示如下:K w+@h l
,z9[+Ss}*^n
(v Y
Q h d _6}1U5D
上图中你可以看到有多个小窗口,每个窗口是一个独立的应用,这些窗口称之为Portlet ,一个Portal 可以看作是Portlet 的集合。
1.3. Portal的组成
一个Portal 可以看作是Portlet 的集合,Portal 需要提供一个Portlet 的运行环境,称之为Portlet Container 。Portlet Container 负责创建Portlet ,管理它们的生命周期;接受Portal 服务器的请求并将请求转发给相应的Portlet ,同时返回Portlet 生成的内容。
而Portal 服务器负责将每个Portlet 生成的内容聚合起来展现给用户,同时负责与用户交互。如下图:
https://www.wendangku.net/doc/3f12459320.html, R:E`1Bw
portal爱好者C A3b l
w{s W9z&{
1.4. Portlet规范https://www.wendangku.net/doc/3f12459320.html,6_'e g#t F S
因此在开发Portal 应用时,应用开发商主要是在开发实现各个功能的Portlet ;同样为了让用户通过Portal 访问自己的产品,产品开发商也为自己的产品提供Portlet 实现。然而不同Portal 服务器各自Portlet 实现的细节有所不同,导致Portlet 无法在不同的Portal 服务器上兼容,对于同一个应用在不同的Portal 服务器上展现需要实现不同的Portlet 。0J%j U MG G,P3}
$q D4F s4v-F C [!S
为了解决这种情况,Portal 服务器厂商开始制定Portlet 规范,目前最重要的规范是:Java Portlet Specification 和Web Services for Remote Portlets 。
https://www.wendangku.net/doc/3f12459320.html,'c-}#X7c d F$p e
其中Java Portlet Specification 由JCP(Java Community Process) 组织维护,属于其中的JSR168 ,已经在2003 年10 月27 日完成1.0 的最终版本;Web Services for Remote Portlets 由OASIS 组织维护,在2003 年8 月其1.0 版本被正式通过为OASIS 标准。portal爱好者0X/v6J0q[|&Y5q8k Q
https://www.wendangku.net/doc/3f12459320.html, m/x-n9E m3ti"`5m
在接下的章节将着重讲述Java Portlet Specification ,并简要介绍Web Services for Remote Portlets (简称WSRP )。
Y q u h }F;C {
2. Java Portlet Specification
2.1. 一个例子-n7Q&|/v\ ]mB A
Java Portlet Specification 中对Portlet 的定义是:
A portlet is a Java technology based web component, managed by a portlet container that processes requests and generates dynamic content. Portlets are used by portals as pluggable user interface components that provide a presentation layer to Information
Systems.
portal爱好者J;P7f w M+_`
到底一个Portlet 是怎么样的,首先让我们来看看这个例子:
)V
K"O;n Y*X/@ ]
Hello.java import java.io.IOException;
import javax.portlet.*;
public class Hello extends GenericPortlet portal爱好者/O N m D|g P8q*v t E { a U e)K m,Z1Y
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException
{
response.setContentType("text/html");
response.getWriter().write("
Hello, this is my first JSR168 portlet!
"); }} https://www.wendangku.net/doc/3f12459320.html,)[X2O}J'v"\
"_9l d"c E:w
#d2B M)x%I3i Q
portlet.xml }W;_%[S%|m*M ]
q }2w xmlns="https://www.wendangku.net/doc/3f12459320.html,/xml/ns/portlet/portlet-app_1_0.xsd" ?q'}Z M,e)X` xmlns:xsi="https://www.wendangku.net/doc/3f12459320.html,/2001/XMLSchema-instance" xsi:schemaLocation="https://www.wendangku.net/doc/3f12459320.html,/xml/ns/portlet">
portal爱好者h)u$cd a&cA
运行结果:(}a#P
i C D-|8S
t z A ~-R
I4R Qa c&~-p N
Z/sW
到目前看来Portlet 和Servlet 很类似,同样都是Java 语言编写的Web 组件,例子中doView() 方法与Servlet 的doPost() 等方法也很类似,那么为什么不直接使用Servlet 技术来实现而需要另外定义一个Portlet 规范呢?
8K h.X N5}C?S"z L(N
事实上Portlet 规范是在Servlet 规范基础上实现的,但是Portlet 还拥有许多Servlet 所没有的特性,在接下的小节中将详细介绍这些特性。
F'V i(O F&q
F(Q%n"a4{T5O F1N v0f
2.2. 生命周期
首先看看Portlet 的接口定义:package javax.portlet
public interface Portlet { U f1W x'H H H l W!U],V
public void init(PortletConfig config) throws PortletException; portal爱好者L-
^i a M X S S T4i
public void processAction( ActionRequest request, ActionResponse response) throws PortletException, IOException; https://www.wendangku.net/doc/3f12459320.html,%`z B V-C9\}
public void render(RenderRequest request, RenderResponse response) throws PortletException, IOException;
public void destroy(); r9A6M6]h n*z_
} portal爱好者2u8H:V D0n c
我们可以看到熟悉的init() 和destroy() 方法,当Portal 服务器启动时,Portal Container 将相应的Portlet 实现类载入、实例化,然后调用init() 方法,开发人员通过该方法实现所需的初始化工作;在服务器退出运行之前,Portal Container 调用每个Portlet 的destroy() 方法,开发人员在这个方法中释放资源。另外的processAction() 和render() 两个方法则是用于处理用户请求,整个周期如下图:
portal爱好者,z'j3^o Q m-X j d
2.3. Portlet Request & URL portal爱好者-n3H X`2T;^7O Z
在一个Portal 页面中,通常都包含了多个Portlet ,在一个时刻用户只能与一个Portlet 交互,当用户向一个Portlet 发出请求(例如点击了“ submit ”按钮),整个Portal 页面将会重新构成。在这个过程中,是否有与用户交互的Portlet 处理方式显然是不同的,而且用户没有与之交互的Portlet 显然不应该受到用户的请求参数。
因此JSR168 规范中将对Portlet 的请求分为Action 和Render 两种。Portlet 在收到Action 请求,获取用户所提交的信息,进行相应的处理;受到Render 请求后,则生成页面代码。当用户向一个Portlet 发出请求,该请求被Portlet 容器接受,Portlet 容器再
调用相应Portlet 的processAction() 方法;等到processAction() 方法执行完毕后,Portlet 容器再调用所有Portlet 的render() 方法,并将这些方法所返回的内容组合形成一个页面返回给客户端。如下图:
*{.y7qv.u,s S^G
在上述过程中,所有Portlet 的render() 方法的调用次序在规范中没有规定,既可能是有顺序的串行调用,也可能是多线程的同步调用,依赖于厂商的具体实现。
y e+P g v m7z
为了接受用户请求,一个Portlet 需要有一个指向其自身的URL ,例如用在HTTP FORM 的ACTION 字段。但是与Servlet 不同的是,Portlet 不是一个完整的页面而只是页面的一部分,一个Portlet 可以出现在多个页面中,所以Portlet 无法绑定具体的URL 。在JSR168 规范中定义了PortletURL 接口,通过该接口可以得到指向Portlet 自身的URL ,对应两种用户请求有两种产生URL 的方法:
&i u b F3E"e X]0Fa g
for render(): PortletURL url = response.createRenderURL(); :K Z8V L6}
url.setParameter(“customer”,”https://www.wendangku.net/doc/3f12459320.html,”); url.setParameter(“show”,”summary”);
/e9g"r+}]
writer.print(“Summary”);
portal爱好者
R!Q F M R
portal爱好者d t t8O-w B b a J
for processAction():
PortletURL url = response.createActionURL();
url.setParameter(“paymentMethod”,”creditCardInProfile”);
url.setWindowState(WindowState.MAXIMIZED); portal爱好者V9i$n%} E(O B V W-T writer.print(“