一、前期准备
liferay IDE :6.1.2
javaJDK :JDK1.6
二、实现原理
资源服务是JSR268标准新增的特性,对应标记为 portlet:resourceURL 这个标记用于处理静态资源文件。该标记使用如下:
<portlet:resourceURL var="ajaxUrl1"/> <portlet:resourceURL var="ajaxUrl2" id="test2"/>
该标记也如 portlet:actionURL 、portlet:renderURL一样 会触发对应的portlet方法,resourceURL标记会触发portlet的 serveResource 方法。
三、开发步骤
(1)编写portlet
在liferay project里新建一个portlet,代码如下:
实现类:AjaxPortlet
package com.myexample.demo.ajax; import java.io.IOException; import java.io.PrintWriter; import javax.portlet.PortletException; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.liferay.portal.kernel.servlet.ServletResponseUtil; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.util.PortalUtil; import com.liferay.util.bridges.mvc.MVCPortlet; /** * Portlet implementation class AjaxPortlet */ public class AjaxPortlet extends MVCPortlet { //请求资源方法 @Override public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException { String resourceID = resourceRequest.getResourceID(); HttpServletRequest request = PortalUtil.getHttpServletRequest(resourceRequest); HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse); String p_p_resource_id =(String)request.getParameter("p_p_resource_id"); String name =(String)request.getParameter("name"); String time =(String)request.getParameter("time"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = null; try { out = response.getWriter(); } catch (IOException e) { e.printStackTrace(); } String result = "这是服务端返回的结果信息:"; if ("test1".equals(resourceID)) { result += "test1"; }else { result += "test2"; } out.println(result); out.flush(); out.close(); super.serveResource(resourceRequest, resourceResponse); } }
portlet.xml 、liferay-portlet.xml、liferay-display.xml 默认就可以。
(2)编写view.jsp页面
这里编写portlet默认显示的页面(默认为 view.jsp)
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> <%@page contentType="text/html; charset=UTF-8" %> <portlet:defineObjects /> <% String rootPaht = renderRequest.getContextPath(); %> <script type="text/javascript" src="<%=rootPaht%>/js/jquery-1.8.2.min.js"></script> <portlet:resourceURL var="ajaxUrl1"/> <portlet:resourceURL var="ajaxUrl2" id="test2"/> <script type="text/javascript"> function ajaxTest(){ $.post('<%=ajaxUrl1%>',{p_p_resource_id:"test1",name: "John", time: "2pm"},function(data){ $('#message').html(data); }) } function ajaxTest2(){ $.post('<%=ajaxUrl2%>',function(data){ $('#message').html(data); }) } </script> <div> 这是Ajax测试,从点击下面的按钮从服务端获取数据。 <input type="button" value="ajax请求1" onclick="ajaxTest();"> <input type="button" value="ajax请求2" onclick="ajaxTest2();"> <div id="message"></div> </div>(3)部署运行
把该portlet添加到 liferay IDE 的 server里 :
ajaxportlet:
四、DEBUG分析
在点击 “ajax请求1” 按钮后,会跳入到 AjaxPortlet 的serveResource 方法里.
在serveResource 里,能获取到
ajax 传递到server的参数,这里有 (注意: 这里 post的参数名为 p_p_resource_id:"test1" 或者 在 <portlet:resourceURL var="ajaxUrl2" id="test2"/> 实际效果是传递 resourceID )
服务端的处理只有一个方法serveResource() ,取得此resourceID,方法为String resourceID = resourceRequest.getResourceID();然后根据不同的resourceID判断处理不同的ajax请求。返回和一般的处理一样。
在浏览器调用firebug 可以看到服务器发过来的数据如下:




浙公网安备 33010602011771号