没有合适的资源?快使用搜索试试~ 我知道了~
JSR286 portlet新特性
3星 · 超过75%的资源 需积分: 10 7 下载量 41 浏览量
2011-12-22
09:12:04
上传
评论
收藏 820KB DOC 举报
温馨提示
试读
42页
文章专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet 新特性和开发流程的开发人员。在学习完本系列后,您将了解相对于 JSR 168 Portlet,JSR 286 Portlet 究竟提供了哪些增强功能, 以及这些新增特性在实际开发中的应用。
资源推荐
资源详情
资源评论
第一部分 Portlet 2.0 新特性介绍
======================================================================
关于本系列
本系列文章专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet 新特
性和开发流程的开发人员。在学习完本系列后,您将了解相对于 JSR 168 Portlet,JSR 286
Portlet 究竟提供了哪些增强功能, 以及这些新增特性在实际开发中的应用。
第 1 部分将简单回顾 JSR 168 Portlet, 并列出了 JSR 286 Portlet 的新增内容。
第 2 部分和第 3 部分将通过在 Apache Pluto 2.0 平台上开发和部署 Portlet 应用程序,
向读者介绍 JSR 286 Portlet 新特性的使用方法。
关于本文
本文假定读者熟知 JSR 168 Portlet,并对 J2EE 基本常识有一定了解。本文主要以理论
的方式向读者介绍 JSR 286 Portlet 的以下新增特性:
资源服务
事件
共享呈现参数
Portlet 过滤器
Portlet 窗口
Portlet 和 JSR 168
Portlet 是部署在容器内用来生成动态内容的 Web 组件,与 servlet 类似,portlet 的整个
生命周期从 init 到 destroy 的过程都在 portlet 容器中进行。Java Portlet Specification 对
portlet API、标准化用户数据、参数设置、portlet 请求以及响应、部署、打包以及安全等方
面都做了详细的规定,以此来实现 portlet 之间以及 portlet 与 portlet 容器之间的交互和协作。
Java Portlet Specification 1.0, 即 Java Specification Request(JSR)168 发布于 2003 年 10 月。
JSR 286 及其新特性
JSR 168 目前在业界受到广泛支持,而且它由开放源码支持。标准和产品的第一个版
本存在一定的缺陷,仅支持最基本的用例,在功能上有一些限制。而且 Java Portlet
Specification V1.0 也 存 在 这 种 情 况 , 因 此 , 经 过 三 年 之 后 , 大 多 数 支 持 Java Portlet
Specification V1.0 的门户产品都提供一些附加扩展,以支持更高级的用例,这些附加的扩
展造成了各个门户产品的标准不统一,彼此间的交互协作成了不可避免的问题。为了更好
地规范 portlet 开发,以适应业界发展,并提供适应于最高级别用例的标准解决方案,从而
为这些高级功能提供互操作性,在 2005 年 11 月开始了 Java Portlet Specification V2.0(称
为 JSR 286)的开发,Java Portlet Specification V2.0 目前已经进入 Final draft 的等待审批阶
段,并计划在 2008 年 3 月正式发布。JSR 286 最终草案兼容了 JSR 168,并完善了 JSR 168
的部分功能,并提供了诸多 JSR 168 所没有的新特性,例如资源服务、事件、portlet 过滤
器、共享呈现参数及 portlet 窗口等。与 V1.0 类似,V2.0 也将基于 J2EE 1.4,因此可让
Portlet 使用 J2EE 1.4 增强(如 JSP 2.0)。下面是该新规范的一些主要功能及特性:
资源服务:一种新的通过 portlet 呈现资源的方式。
事件:通过发送事件和接收事件来实现 portlet 之间的通信。
Portlet 过滤器:与 servlet 过滤器类似,根据 Portlet 请求和响应动态的呈现内容的变换。
存在以下四种类型的 portlet 过滤器:
Action 过滤器
Render 过滤器
Resource 过滤器
Event 过滤器
共享呈现参数:除了 portlet 私有的呈现参数之外,新增了可以在 portlet 之间共享的呈
现参数。
Portlet 窗口:提供 portlet 窗口 ID 供 portlet 使用。
下面我们将对 JSR 286 所提供的这些新功能及其使用逐一做详细介绍。
资源服务
在 JSR 168 中,Portlet 服务于资源的方法只有两种:直接链接到资源,或者通过
Portlet 服务于资源。两种方法分别适用于不同目的的需要,各有优缺点。
直接链接对于所有 Portlet 状态都相同的静态资源非常有效,但对于其他用例效果却不
太好,因为需要考虑来自 Portlet 上下文的信息。这样的示例包括基于 Portlet 模式、窗口状
态、当前呈现参数或 Portlet 首选项呈现不同资源。
以一个 JSP 文件 test.jsp 为例,如果要访问该资源,可以直接通过超链接访问该文件,
如清单 1 所示:
清单 1. 直接访问资源文件
<a href="<c:url value="/test.jsp" />">test.jsp</a>
或者通过 Servlet 转向,如清单 2 和清单 3 所示:
清单 2. 直接访问 Servlet
<a href="<c:url value="/testServlet" />">testServlet</a>
清单 3. Servlet 对资源文件的访问控制
public void service(ServletRequest request, ServletResponse response)
throws ServletException,IOException {
...
在此添加访问控制等业务逻辑代码
...
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/test.jsp");
rd.forward(request, response); //或者为 rd.include(request, response);
}
从清单 1、2、3 可以看到,直接链接到资源这种方式,无法访问到相关 Portlet 的信息,
包括 Portlet 模式、窗口状态、当前呈现参数或 Portlet 首选项等。而通过 Portlet 呈现资源的
优势是可以通过门户访问资源,因此可以通过控制门户访问而对资源提供保护。但是,这
也带来了额外的门户请求开销,加重了门户服务器的负载。
为了更好的解决这两种方法的局限性,JSR 286 采用了一种新的资源服务方式 ——
Portlet 资源服务。即 JSR 286 引入了一个新的具有 serveResource 方法的可选生命周期接口
ResourceServingPortlet , 该 接 口 可 以 由 ResourceURL 触 发 , Portlet 可 以 通 过
PortletResponse.createResourceURL 方法创建它。资源 URL 包含当前 Portlet 的瞬时状态
(Portlet 模式、窗口状态和呈现参数),但不能为此状态设置新值。资源 URL 可以有在资
源 URL 上设置的其他资源参数。
通过调用 ResourceServingPortlet 接口的 serveResource() 方法, Portlet 不仅可以通过控
制门户访问而对资源进行保护,并且 Portlet 容器不会呈现任何除 serveResource() 方法返回
的内容之外的附加输出。这样,用户由于可以直接通过操作响应对象而被赋予了更多的控
制权限,并且没有额外门户请求的开销,减轻了门户服务的负载。而 Portal 服务器此时只
是充当了一个代理服务器的作用。
JSR 286 资源服务的使用方法:
Portlet 类需实现 javax.portlet.Portlet 和 javax.portlet.ResourceServingPortlet 接口并实现
serveResource() 方法, 如 清单 4 所示:
清单 4. Portlet 对资源文件的访问控制
public class TestPortlet implements Portlet, ResourceServingPortlet
{
......
public void serveResource(ResourceRequest resourceRequest,
ResourceResponse resourceResponse) throws PortletException,
IOException {
...
在此添加访问控制等业务逻辑代码
...
PortletRequestDispatcher portletRequestDispatcher = portletConfig
.getPortletContext().getRequestDispatcher(
"/WEB-INF/jsp/TestPortletResource.jsp");
portletRequestDispatcher.include(resourceRequest, resourceResponse);
}
......
}
使用 JSP 标签通过 PortletResponse.createResourceURL 方法创建 RecourceURL:
清单 5. 创建资源访问 URL
<a href="<portlet:resourceURL/>">Click me to request Resource URL</a>
所保护的访问资源,在此例中即为 TestPortletResource.jsp 。
接下来,我们就可以充分体验 JSR 286 资源服务新特性所带来的简单便捷以及高性能
了。
对照该介绍,读者可参照本系列第 2 部分对资源服务特性的实例开发加深对该部分相
关内容的理解。
事件
JSR 286 定义的事件模型是一种松耦合的代理事件模型。在此模型中,Portlet 定义可以
接收以及在 Portlet 部署描述符中公布的事件。在运行时,门户管理员(或业务用户)可以
将不同的 Portlet 连接在一起。
Portlet 事件服务并不是一个可信任消息服务(例如 JMS)的替代。很多情况下 Portlet
事件并不能总是保证能够传送到目的地。因此 Portlet 必须能够在部分或即使所有事件都不
能正确接收的情况下仍然能够工作。
另外,有的时候 Portlet 为了响应某一个事件,也会向另外的 Portlet 发布新的事件,这
样就形成了事件的衍生代。这在一定程度上可能造成事件的死锁,JSR 286 本身没有对衍
生代做出限制,但是很多 Portlet 容器会定义事件的最大衍生代以防止死锁的发生。读者在
开发相关应用时请注意其本身的限制。
事件声明
对于一个事件的声明包括三个部分,分别是事件的定义声明、事件的发布载体声明也
就是发布该事件的 Portlet 声明、事件接收载体的 Portlet 声明。
事件定义声明:我们需要在 portlet.xml 中使用 <event-definition> 元素对事件进行声明,
并且该元素与 <portlet> 元素并列作为 <portlent-app> 的子元素。
清单 6. event-definition 声明
<portlet-app id="myPortletApp" version="2.0">
<portlet>
...
</portlet>
<event-definition> . . .</event-definition>
...
</portlet-app>
对于一个事件的声明有两点需要注意:事件的名称和值的类型。对于事件名称,JSR
286 既可以为事件定义默认的命名空间,其作用域为所有未声明 QName 的事件;也可以为
事件单独定义自己的 QName。对于 QName 和命名空间的理解,请读者参考 XML 规范的
相关文档,本文不做详细介绍。对于事件值的类型,既可以是简单的 Java 对象,例如
Integer,String 等,也可以是预先定义的 Java 复杂对象,但是前提是该对象必须实现
Serializable 接口。其中 <event-definition> 的具体格式如 清单 7 和 清单 8 所示:
清单 7. 默认命名空间下事件定义声明
<default-namespace>http://cn.ibm.com/</default-namespace>
......
<event-definition>
<name>event-with-simple-value</name>
<value-type>java.lang.String</value-type>
</event-definition>
<event-definition>
<name>event-with-complex-value</name>
<value-type>com.ibm.jsr286.TestEventBean</value-type>
</event-definition>
清单 8. 自定义 QName 下事件定义声明
<event-definition>
剩余41页未读,继续阅读
资源评论
- AFUL2013-08-26规范讲的挺细致的
xuanjianlingbing
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功