日期:2014-05-16  浏览次数:21126 次

基于serverResource方式的liferay中ajax方式的的实现

在portlet2.0中加入了几大新特性。

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

事件通信可以参考我前面提到的一篇文章。本文章中主要讨论 使用资源服务的方式来完成一个ajax方式访问资源的方式。

JSR 286 采用了一种新的资源服务方式 —— Portlet 资源服务。即 JSR 286 引入了一个新的具有 serveResource 方法的可选生命周期接口 ResourceServingPortlet ,该接口可以由 ResourceURL 触发,Portlet 可以通过 PortletResponse.createResourceURL 方法创建它。资源 URL 包含当前 Portlet 的瞬时状态(Portlet 模式、窗口状态和呈现参数),但不能为此状态设置新值。资源 URL 可以有在资源 URL 上设置的其他资源参数。

通过调用 ResourceServingPortlet 接口的 serveResource() 方法, Portlet 不仅可以通过控制门户访问而对资源进行保护,并且 Portlet 容器不会呈现任何除 serveResource() 方法返回的内容之外的附加输出。这样,用户由于可以直接通过操作响应对象而被赋予了更多的控制权限,并且没有额外门户请求的开销,减轻了门户服务的负载。而 Portal 服务器此时只是充当了一个代理服务器的作用。

?

在本例子中我们使用jquery的EasyUI 组件作为测试UI。实现的方式主要有两点需要注意。

第一:用创建的resourceURL 代替原来的xx.do请求。

第二:在serveResource中 返回ajax请求所需要的json数据。

(ps:在liferay中使用了有自己的前端框架。其中默认支持了ajax方式。可以参考liferay的官方维基)

?

要实现资源服务必须实现ResourceServingPortlet 这个新增加的接口。在liferay中文名使用MVCPortlet,它extends 了GenericPortlet,后者实现了所有的接口。所以我们可以直接在我们的portlet类中直接使用资源服务。

?

主要代码示例:

?