在portlet2.0中加入了几大新特性。
事件通信可以参考我前面提到的一篇文章。本文章中主要讨论 使用资源服务的方式来完成一个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类中直接使用资源服务。
主要代码示例:
前端(定义用于ajax请求的resourceURL)
var url = "<%=userList%>";
var newUserurl = "<%=newUser%>";
在js中使用对应的url替换以前的xxx.do请求。
$('#usergrid').datagrid({
title:'user information',
nowrap: false,
width:'auto',
height:400,
url:url,
striped: true,
collapsible:true,
remoteSort: false,
idField:'id',
。。。。。
通过上述的对应关系 就可以像以往使用ajax一样在liferay中使用ajax了。
后台的服务逻辑:
public void serveResource(ResourceRequest resourceRequest,ResourceResponse resourceResponse) throws IOException,PortletException {
PrintWriter write = resourceResponse.getWriter();
String resourceID = resourceRequest.getResourceID();
if (resourceID.equals("userList")){
List
try{
String userJson = Object2JsonUtil.toJSONString(users);
String jsonStr = "{\"rows\":"+userJson+"}";
write.write(jsonStr);
}catch(Exception e){
e.printStackTrace();
}
}
else if(resourceID.equals("newUser")){
System.out.println(resourceRequest.getParameter("name"));
System.out.println(resourceRequest.getParameter("password"));
System.out.println(resourceRequest.getParameter("phone"));
System.out.println(resourceRequest.getParameter("email"));
write.write("\"message\":\"maomao\",\"success\":\"true\"}");
}
super.serveResource(resourceRequest, resourceResponse);
}
其中resourceID 对应
这样一个基于资源服务的ajax请求就完成了。
附录是JSR268的详解稳定。如果需要这个例子的源代码。可以给我留个邮箱。