首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JSR 286 Portlet 的新特性,第 三 部分: Portlet 过滤器和 Portlet 窗口

2012-10-16 
JSR 286 Portlet 的新特性,第 3 部分: Portlet 过滤器和 Portlet 窗口  在 本系列 的 第 1 部分 简要回顾

JSR 286 Portlet 的新特性,第 3 部分: Portlet 过滤器和 Portlet 窗口


  在 本系列 的 第 1 部分 简要回顾了JSR 168 Portlet,并对 JSR 286 Portlet 的新增特性做了详细的介绍,第 2 部分 和第 3 部分将通过在 Apache Pluto 2.0 平台上开发和部署 Portlet 应用程序, 向读者介绍 JSR 286 Portlet 新特性的使用方法。本文将介绍 JSR 286 Portlet 的 Portlet 过滤器和 Portlet 窗口应用程序开发。


  关于本系列


  本系列 专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet新特性和开发流程的开发人员。在学完本系列后,您将了解到相对于 JSR 168 Portlet,JSR 286 Portlet究竟提供了哪些增强功能, 以及这些新增特性在实际开发中的应用。


  本系列的 第 1 部分 简单回顾了 JSR 168Portlet, 并列出了 JSR 286 Portlet 的新增内容。第 2 部分 和第 3 部分将通过在 Apache Pluto 2.0平台上开发和部署 Portlet 应用程序,向读者介绍 JSR 286 Portlet 新特性的使用方法。


  关于本文


  本文承接 第 2 部分,继续介绍 JSR 286 Portlet 的 Portlet 过滤器和 Portlet 窗口应用程序开发。阅读本文之前,您应当对 JSR 168 Portlet 有所了解,并阅读了本系列的 第 1 部分 和 第 2 部分。


  Portlet 过滤器


  通过 第 1 部分 的介绍,我们知道 Portlet 过滤器分为:


  Action 过滤器


  Render 过滤器


  Resource 过滤器


  Event 过滤器


  我们将首先对这四种 Portlet 过滤器的开发使用流程分别单独进行介绍,然后将这四种 Portlet过滤器综合起来进行更进一步的开发,最后通过和 Servlet 过滤器的结合使用,使读者明白 Portlet 过滤器和 Servlet过滤器的关系和区别。


  Action 过滤器


  新建 Java 类 TestActionFilter:


  清单 1. TestActionFilter.java 文件



  清单 4. Action 过滤器调用结果



  清单 16. Event 过滤器调用结果



?

  TestAllPhaseFilter 实现代码如清单 17 所示:


  清单 17. TestAllPhaseFilter.java 文件



?

  其中图 2 中的两个 Portlet 过滤器组成了过滤器链( Portlet Filter Chain),Portlet 请求先流经Portlet 过滤器链,最后到达 Portlet, Portlet 响应同样也流经 Portlet 过滤器链到达 Portal页面聚集内容显示。


  TestAllPhaseFilter 支持 Portlet 四个阶段的响应,在 Portlet 特定的阶段,可以分别和 1 - 4 节中的 Portlet 过滤器形成过滤器链,读者可以从日志输出的 Porltet 过滤器调用次序证明这一点。


  和 Servlet 过滤器的结合


  从本系列 第 1 部分 的图 3 所示,我们已经得知,Servlet过滤器是一个门户级过滤器,它是接收和修改客户端请求的第一个组件,同时也是修改对客户端的响应的最后一个组件。Servlet 过滤器比Portlet 过滤器的优先级别要高,容器将首先进行 Servlet 过滤,其次是 Portlet 过滤。


  为了在 Portal 容器中测试 Servlet 过滤器,我们最好能自己将 Portal 容器构建起来。幸运的是,Apache Pluto 使用 Servlet 实现了轻量级的 Portal 容器,我们很容易就可以做到这一点。


  使用 Pluto 构建自己的门户


  将 ${TOMCAT_HOME}\PlutoDomain\ 下的 pluto-portal-2.0.0-SNAPSHOT.war 解压缩。目录结构如图 3 所示:


  图 3. pluto-portal-2.0.0-SNAPSHOT 目录结构



JSR 286 Portlet 的新特性,第 三 部分: Portlet 过滤器和 Portlet 窗口
?

  在 Eclipse 新建动态 web 项目 myportal, 运行时选择 Tomcat 6,Servlet 版本选择 2.3。


  将 jsr286portles 项目中 WebContent\META-INF\ 目录下的 context.xml 文件复制到 myportal 项目的 WebContent\META-INF\ 目录下。


  将 pluto-portal-2.0.0-SNAPSHOT\ 目录下的以下目录和文件拷贝到 myportal 项目的 WebContent\ 目录下。


  images 目录


  pluto.css 文件


  pluto.js 文件


  portlet-spec-1.0.css 文件


  将 pluto-portal-2.0.0-SNAPSHOT\WEB-INF\ 目录下的以下目录和文件拷贝到 myportal 项目的 WebContent\WEB-INF 目录下。


  lib 目录


  tld 目录


  themes 目录


  pluto-portal-driver-services-config.xml 文件


  将 pluto-portal-2.0.0-SNAPSHOT\WEB-INF\classes\ToolTips.properties 文件复制到 myportal 项目的 src 目录下。


  编辑 myportal 项目的 web.xml 文件,内容如清单 19 所示:


  清单 19. web.xml 文件


?

  

????? 创建 Servlet 过滤器


  在 myportal 项目中新建 Java 类 TestServletFilter, 如清单 21 所示:


  清单 21. pluto-portal-driver-config.xml 文件



?


  读者可以从日志输出注意到 Servlet 过滤器和 Portlet 过滤器的以下区别和联系:


  Servlet 过滤器在 Web 应用启动时初始化,在 Web 应用关闭时销毁;Portlet 过滤器在访问相应 Portlet 的时候初始化,在 Portlet 访问结束的时候销毁。


  Servlet 过滤器在访问所有 portlet 的聚合体 - portal 页面的时候调用,并在所有的 portlet 过滤器调用之前调用。


  Servlet 过滤器过滤的对象是整个 Portal 页面或者一个完整的资源, Portlet 过滤器过滤的对象是 Portal页面上的组成元素 Portlet 小部件,当然 Portlet 过滤器也可以通过 Resource Filter 过滤一个单独的资源。


  Servlet 过滤器只可以对 Servlet 唯一的生命阶段 Servlet 响应阶段进行过滤,Portlet 过滤器可以分别对 Portlet 的操作、呈现、事件、资源这四个不同的生命阶段进行过滤。


  Portlet 窗口


  PortletRequest 新增了一个方法 getWindowID(),可以获得 Portlet 的窗口 ID,这个 ID是由容器生成的。在 Portal 容器中布局同一个 Portlet 多次的情况下,windowID 可以用来区分同一个 Portlet的不同窗口,从而可以使这些 Portlet 窗口缓存并呈现不同的数据。


  在本节中,将提供一个示例,在同一个 portlet 的不同窗口中,根据 Portlet 窗口 ID 的不同,呈现不同的数据。


  准备数据


  本例中我们使用 xml 文件提供两个联系人数据,在工程 jsr286portlets 的 src 目录下, 新建 address.xml 文件,内容如清单 23 所示:


  清单 23. address.xml 文件



?


  在 EDIT 模式下,分别选择不同的选项,然后提交,如图 7:


  图 7. EDIT 模式下选择不同的选项



JSR 286 Portlet 的新特性,第 三 部分: Portlet 过滤器和 Portlet 窗口
?

  最后两个窗口可以显示不同的数据,如图 8 所示:


  图 8. TestWindowPortlet 的两个窗口分别显示不同的数据



JSR 286 Portlet 的新特性,第 三 部分: Portlet 过滤器和 Portlet 窗口
?

  关于本示例的引申


  在该示例中,我们使用 XML 文件存储数据。在实际的生产环境中,数据来源可能是一个关系数据库,甚至是一个远程调用(比如 WebServices)。在这种情况下,如果数据的更新周期比较长,就可以通过数据的缓存提高性能。在同一个 portal 页面中,如果存在同一个portlet 的不同窗口副本,就可以根据 Portlet 的窗口 ID,把从数据库调用或者远程调用获得的数据缓存到 PortalServer 本地,并且和 Portlet 的特定窗口关联起来,以减少数据库访问或者远程调用的开销,提高系统的性能。本例中使用 Portlet上下文缓存数据,实际生产过程中可以使用某些缓存产品,如 Ehcache 等。


  小结


  本部分通过示例代码介绍了 JSR 286 Portlet 过滤器和 Portlet 窗口的实际开发使用步骤。至此,JSR 286 Portlet 的新特性及开发示例已经全部介绍完毕。


附件:本文示例源代码或素材下载


热点排行
Bad Request.