`

《portal开发指南》第一章

 
阅读更多

一、 Portlet简介

Portlet与servlet一样,都是jcr的规范api定义,不同的portlet还比较“年轻”,目前版本还只到2.0,而servlet规范已经相当成熟,发布了多个版本。如果不是十分准确的说,portlet只是另一种开发web程序的api,从这个方面说,开发portlet并没有什么神秘的地方,但是之所以有portlet这个规范,portlet适用的场景肯定与servlet是不同的,比如开发portlet不但要与portlet容器打交道,还要与portal打交道。读者在学习portlet开发的过程中,可以不时的用servlet的概念与portlet相比较,比较两者的异同,可以达到事半功倍的效果。

刚才说到portlet规范已经出到2.0,分别是jsr168,jsr286。JSR 168 目前在业界受到广泛支持,目前我们开发的大部分代码都是基于jsr168的,jsr168规范支持基本的开发方式,虽然提供的功能比较少,但是已经基本可以满足日常需要。Jsr168发布三年之后,大多数支持 Java Portlet Specification V1.0 的门户产品都提供一些附加扩展,以支持更高级的用例,这些附加的扩展造成了各个门户产品的标准不统一,彼此间的交互协作成了不可避免的问题。为了更好地规范 portlet 开发,以适应业界发展,并提供适应于最高级别用例的标准解决方案,从而为这些高级功能提供互操作性,在 2005 年 11 月开始了 Java Portlet Specification V2.0(称为 JSR 286)的开发,在2008年1月Java Portlet Specification V2.0 目前已经正式发布。JSR 286规范兼容了 JSR 168,并完善了 JSR 168 的部分功能,并提供了诸多 JSR 168 所没有的新特性,例如资源服务、事件、portlet 过滤器、共享呈现参数及 portlet 窗口等。与 V1.0 类似,V2.0 也将基于 J2EE 1.4,因此可让 Portlet 使用 J2EE 1.4 增强(如 JSP 2.0)。下面是该新规范的一些主要功能及特性:

  1. 资源服务:一种新的通过 portlet 呈现资源的方式。
  2. 事件:通过发送事件和接收事件来实现 portlet 之间的通信。
  3. Portlet 过滤器:与 servlet 过滤器类似,根据 Portlet 请求和响应动态的呈现内容的变换。存在以下四种类型的 portlet 过滤器:
    • Action 过滤器
    • Render 过滤器
    • Resource 过滤器
    • Event 过滤器
  4. 共享呈现参数:除了 portlet 私有的呈现参数之外,新增了可以在 portlet 之间共享的呈现参数。
  5. Portlet 窗口:提供 portlet 窗口 ID 供 portlet 使用

要讲解portlet,首先要明确三个概念:portal、portlet、portlet容器。Portlet与portlet容器的关系可以比较servlet与servlet容器的关系,两者是完全一致的,开发者按照portlet规范开发portlet,部署在中间件提供商(ibm、oracle、apache)提供的portlet容器中运行,比较难理解的是portal,首先portal是一个JEE的application,portal负责提供页面给客户,其次portal里面的内容是portlet生成出来的。一般的过程是,用户通过web客户端向portal发起http请求,portal解析这些请求,把请求“下发”给portlet容器,portlet容器来调用portlet,由portlet产生输出返回给portlet容器,portlet容器再把输出返回给portal,portal负责把这些portlet的输出聚集起来,把内容返回给web客户端。下面来具体描述一下portal、portlet、portlet容器三个概念。

什么是portal

Portlet规范中是这样定义portal的:

A portal is a web based application that –commonly- provides personalization, authentication,, content aggregation from different sources and hosts the presentation layer of Information Systems.

 

Portal是一个基于web的提供个性化、登录授权、从不同的数据源聚集内容基于展现层的信息系统。具体到J2EE领域,portal大多数情况是一个符合J2EE标准的ear包工程。

什么是portlet

规范中式这样定义portlet的:

A portlet is an application that provides a specific piece of content (information or service) to be included as part of a portal page. It is managed by a portlet container, that processes requests and generates dynamic content

 

一个Portlet是一个基于java技术的被portlet容器管理的web组建,它可以处理requests、生成动态的内容输出,一个portlet负责提供portal 页面中的某个特定部位的展现内容。

与servlet同样,portlet的生命周期是被portlet容器来管理的。Portlet生成的内容也可以称作fragment,这些多个portlet生成的多个fragment会被portal聚集(aggregate)在一起展现。不同用户看到的portlet可能不同,这依赖于不同用户对使用portlet的配置。

什么是portlet容器

规范中式这样定义portlet容器的

A portlet container runs portlets and provides them with the required runtime environment. A portlet container contains portlets and manages their lifecycle. It also provides persistent storage for portlet preferences. A portlet container receives requests from the portal to execute requests on the portlets hosted by it.

 

Portlet容器提供portlet生命周期环境,管理portlet的生命周期,还提供portlet preferences的持久化支持,portlet从portal接受请求,然后分发给运行其上的portlet。

Portlet不负责聚集portlet生成的内容,这是portal责任。根据中间件厂商的实现方式portlet容器与portal可以放在一个application中实现,也可以放在两个不同的application中实现。

三者关系

下面是以一个用户使用web客户端来与portal交互的用力,描述portlet、portlet容器、portal三者关系、责任:

1. web客户端通过http 来对portal发起request请求

2. request请求被portal就收到

3. portal分析这个请求是否需要与portlet进行交互

4. 如果需要,则portal通知portlet容器调用portlet处理交互

5. Portal通过portlet容器得到portlet返回的fragments

6. Portal聚集portlet产生的fragments,生成最终的页面,返回给web客户端

版本兼容性

Jsr286规范是向后兼容的,所以所有基于jsr168写的代码生成的war都可以在jsr286容器里面运行。不过下面罗列出一些特例,这些特例会在具体章节说明。

1. RenderResponse.setContentType已经不再需要在getWriter 或者getOutputstream之前调用了,已经不会产生IllegalStateException

2. 对于在portlet工程中嵌入servlet、jsp调用getProtocol,jsr168中返回时null,jsr286中返回时HTTP/1.1

JSR286的主要新特性

Jsr286对Jsr168是向后兼容的,jsr286主要增加了如下新特性:

Ø 事件Events,可以是portlet可以接受、发送事件

Ø 公共展现参数public render parameters,容许portlet之间共享参数

Ø 资源服务 resource serving ,提供portlet服务资源的能力

Ø Portlet 拦截器 portlet filter,容许在portlet的request、response之间建立拦截器

与J2EE的版本对应

J2EE

servlet

jsp

JSR168

1.3

2.3

1.2

JSR286

1.4

2.4

2.0

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics