fs_jin

导航

 

一、前期准备

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里 :

image

ajaxportlet:

image

 

四、DEBUG分析

在点击 “ajax请求1” 按钮后,会跳入到 AjaxPortlet 的serveResource 方法里.

image

在serveResource 里,能获取到

ajax 传递到server的参数,这里有 (注意: 这里 post的参数名为 p_p_resource_id:"test1" 或者 在 <portlet:resourceURL var="ajaxUrl2" id="test2"/> 实际效果是传递  resourceID )

image

服务端的处理只有一个方法serveResource() ,取得此resourceID,方法为String resourceID = resourceRequest.getResourceID();然后根据不同的resourceID判断处理不同的ajax请求。返回和一般的处理一样。

在浏览器调用firebug 可以看到服务器发过来的数据如下:

image

posted on 2014-01-07 15:25  fs_jin  阅读(509)  评论(0)    收藏  举报