什么是Portal
从最宏观的角度来说,portal归根结底是一个内容聚集的平台。典型的场景是这样:一个企业(或者政府部门)拥有这个那个的业务系统,譬如网上注册、网上年检、新闻发布、咨询公告、外汇牌价、天气预报……这堆东西怎么给用户集中展现?怎么让用户定制自己想看到的界面?怎么实现单点登录?这是portal要解决的问题。各个application提供业务能力,portal提供一个统一的look and feel。所以portlet和servlet绝对不是竞争的关系,portlet的功能是“聚集+展现”,应该尽量回避具体于业务的逻辑。
举个例子。工商局的portal可能是这样:普通用户可以定制几个信息发布类的portlet,例如新闻、公告、外汇牌价和天气预报,这些portlet从后面的application那里获得RSS feed,再根据用户选择的skin显示出来;企业用户登录之后,有一个portlet可以看到自己的年检进度(也是通过RSS获得信息),再点一个链接就进入年检系统,并且已经携带了登录信息;工商局内部用户登录以后,就有几个portlet显示待办事宜、学习文件等等(还是RSS),同样是点一个链接进入年检系统直接处理一个待审企业。
IBM Websphere Portal好象就是用JetSpeed为基础做的,所以API都一样。JSR 168定义的接口和JetSpeed现在的接口也差不多。JSR 168没有定义portlet之间的事件模型,我感觉这块也是很有必要的,因为有时portlet也需要直接提供一些简单的交互性。譬如说,“文件浏览”portlet也许可以直接把文件摘要显示出来,领导看个大概齐就在后面点一下“同意”了事,这时“待办事宜”portlet里面就应该把这个文件的链接去掉。
Portal是一个基于web的应用程序,它主要提供个性化、单点登录、不同来源的内容整合以及存放信息系统的表示层。
什么是Portlet?
Portlet是基于java技术的web组件,它由portlet容器管理、并处理请求,并动态生成输出内容。
Portlet是基于java的web组件,由portlet容器管理,并由容器处理请求,生产动态内容。Portals使用portlets作为可插拔用户接口组件,提供信息系统的表示层。作为利用servlets进行web应用编程的下一步,portlets实现了web应用的模块化和用户中心化。portlet规范,即jsr(java specification request)168,是为了实现portal和portlet的互操作。它定义了portlet和portlet容器之间的和约,让portlet实现个性化、表示和安全的api集。规范还定义了怎样在portlets应用中打包portlets。
Portal标准
为规范Portal,SUN于2003年底制定了JSR168,它定义了portlet标准,并给出了一个实现接口。
Portlets与Servlet的异同?
相同点
基于web应用的java技术
由特定的容器管理
动态生成内容
生命周期由容器进行管理
通过request/reponse进行交互
不同点
portlet只生成片段
portlet并不直接绑定到某一个URL上
portlet通过portal进行交互
portlet可以多次在同一个portal页面上同时出现
portlet优点
能访问到用户配置信息
能在不同的域中存储会话:应用程序级到私有级。
portlet与servlet的关系
前者能调用后者,并且能共享信息,包括:Attributes
portlet容器是servlet容器的扩展
portlet无法做到的事情
设置response的字符集编码
设置http header
获取客户端的request
Portlets实例
如果是在普通的场合下使用,即不是在分布式场合,则每个portal应用就会生成一个portlet实例。而如果是在分布式场合下使用的话,则每个jvm只有一个实例。
Portlet生命周期
Portlet接口的四个方法构成一个完整的生命周期:init, processAction,render,destroy
public void init(PortletConfig config) throws PortletException;
由portlet容器调用,在将portlet放入服务区前调用。portlet容器在初始化portlet后,直接调用这个方法。
public void processAction (ActionRequest request, ActionResponse response)
throws PortletException, java.io.IOException;
由portlet容器调用,用来处理action request。
public void render (RenderRequest request, RenderResponse response)
throws PortletException, java.io.IOException;
由portlet容器调用,用来生成输出。
public void destroy();
将portlet从服务区中删除。
Portlet URLs
如何生成Portlet URL
RenderResponse.createActionURL
RenderResponse.createRenderURL
调用setParameter、setParameters可以用来设置参数.
如何使用Portlet URL
开发者不可以对参数进行任何编码,它(编码)是由portlet容器进行的。见下面例子:
PortletURL url = response.createRenderURL();
url.setParameter(“customer”,”foo.com”);
url.setParameter(“show”,”summary”);
writer.print(“Summary”);
portlet URL可以包含portlet的模式及窗口的状态,见下面例子:
PortletURL url = response.createActionURL();
url.setParameter(“paymentMethod”,”creditCardInProfile”);
url.setWindowState(WindowState.MAXIMIZED);
writer.print(“ ”);
setSecure方法用来设置是否是https。