首先,ajax portlet显示秒响应

时间:2013-07-04 12:44:12

标签: ajax jquery liferay liferay-6

我是liferay的新手。我想要两个portlet从数据库的两个不同表中获取数据。必须自动获取数据而不刷新页面(使用ajax)。问题是我创建的portlet正在获取数据并正确显示它,如果其中一个部署在页面中。如果它们都已部署,那么它们将显示第二个portlet表数据,即如果门户中只有一个portlet显示正确的数据(特定的portlet表)并自动获取,如果两者都在门户中,则它们将获取第二个部署的portlet的数据(显示两个portlet的相同数据)。

这是我的两个portlet的jsp代码,我正在使用服务构建器来获取数据。

Portlet A

view.jsp的

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui"%>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui"%>
<%@ page import="javax.portlet.PortletContext"%>
<%@ page import="com.liferay.portal.kernel.portlet.LiferayWindowState"%>
<%@ page import="javax.portlet.RenderRequest"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.portlet.*"%>

<portlet:defineObjects />

<portlet:actionURL
    windowState="<%=LiferayWindowState.EXCLUSIVE.toString()%>"
    var="fetchDatabase">
    <portlet:param name="databaseFetch" value="fetchWorkData"></portlet:param>
</portlet:actionURL>

<%
    PortletPreferences prefs = renderRequest.getPreferences();
%>

<script type="text/javascript">
var url = '<%=fetchDatabase.toString()%>';

    $(document).ready(function() {      
        $("#fetchLink").click(function() {
            $.post(url).done(function(data) {
                $("#fetchData").html(data);
            }); 
        });
    });

    $(document).ready(function() {
        //For Initial loading of database
         $('#fetchData').load(url);     
        function timeRefresh() {
            // setTimeout("location.reload(true);",timeoutPeriod);
            // make a ajax call here.
            $.post(url).done(function(data) {
                $("#fetchData").html(data);
            });
        }
        //Recalling the function repeatedly in given interval
        setInterval(function() {
            timeRefresh();
        }, 6000);
    });
</script>

<aui:layout id="fetchedData">
    <aui:button value="Refresh" id="fetchLink"></aui:button>
    <hr />
    <aui:layout id="fetchData"></aui:layout>
</aui:layout>

FetchData.java

package com.cherry.ajax.database;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import com.cherry.ajax.database.service.TestLocalServiceUtil;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.util.bridges.mvc.MVCPortlet;

/**
 * Portlet implementation class FetchData
 */
public class FetchData extends MVCPortlet {

    String action = "";

    @Override
    public void processAction(ActionRequest request, ActionResponse response)
            throws IOException, PortletException {
        action = request.getParameter("databaseFetch");
        try {

                TestLocalServiceUtil.add();

        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void doView(RenderRequest request, RenderResponse response)
            throws IOException, PortletException {
        response.setContentType("text/html");
        PortletRequestDispatcher dispatcher = null;
        if (action.equals("fetchWorkData")) {
            dispatcher = getPortletContext().getRequestDispatcher(
                    "/html/jsp/showData.jsp");
        } else {
            dispatcher = getPortletContext().getRequestDispatcher(
                    "/html/jsp/view.jsp");
        }
        action = "";
        dispatcher.include(request, response);
    }



}

Portlet B

view.jsp的

 <%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui"%>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui"%>
<%@ page import="javax.portlet.PortletContext"%>
<%@ page import="com.liferay.portal.kernel.portlet.LiferayWindowState"%>
<%@ page import="javax.portlet.RenderRequest"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.portlet.*"%>

<portlet:defineObjects />

<portlet:actionURL
    windowState="<%=LiferayWindowState.EXCLUSIVE.toString()%>"
    var="workloadUrl">
    <portlet:param name="drAction" value="getWorkData"></portlet:param>
</portlet:actionURL>

<%
    PortletPreferences prefs = renderRequest.getPreferences();
%>

<script type="text/javascript">
var url = '<%=workloadUrl.toString()%>';

    $(document).ready(function() {      
        $("#workloadLink").click(function() {
            $.post(url).done(function(data) {
                $("#drData").html(data);
            }); 
        });
    });

    $(document).ready(function() {
        //For Initial loading of database
         $('#drData').load(url);    
        function refresh() {
            // setTimeout("location.reload(true);",timeoutPeriod);
            // make a ajax call here.
            $.post(url).done(function(data) {
                $("#drData").html(data);
            });
        }
        //Recalling the function repeatedly in given interval
        setInterval(function() {
            refresh();
        }, 6000);
    });
</script>

<aui:layout id="DrWorkload">
    <aui:button value="Refresh" id="workloadLink"></aui:button>
    <hr />
    <aui:layout id="drData"></aui:layout>
</aui:layout>

DrStatus.java

package com.cherry.ajax.database;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import com.cherry.ajax.database.service.WorkloadLocalServiceUtil;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.util.bridges.mvc.MVCPortlet;

/**
 * Portlet implementation class DrStatus
 */
public class DrStatus extends MVCPortlet {

    String action = "";

    @Override
    public void processAction(ActionRequest request, ActionResponse response)
            throws IOException, PortletException {
        action = request.getParameter("drAction");
        try {

                WorkloadLocalServiceUtil.check();

        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void doView(RenderRequest request, RenderResponse response)
            throws IOException, PortletException {
        response.setContentType("text/html");
        PortletRequestDispatcher dispatcher = null;
        if (action.equals("getWorkData")) {
            dispatcher = getPortletContext().getRequestDispatcher(
                    "/html/drstatus/workloadData.jsp");
        } else {
            dispatcher = getPortletContext().getRequestDispatcher(
                    "/html/drstatus/view.jsp");
        }
        action = "";
        dispatcher.include(request, response);
    }

}

如果我做错了,请建议我......

提前致谢

Samith K S

3 个答案:

答案 0 :(得分:2)

问题很可能是你有两个具有相同ID的DOM元素(来自两个portlet)。这是门户网站中的常见问题:您永远不知道与谁共享页面,因此您必须生成有保证的唯一标识符。

执行此操作的一种方法是使用<portlet:namespace/>的输出 - 这是一个标准化标记,可为每个portlet生成唯一值。它在同一个portlet中始终是相同的。然后使用它来生成您的ID值:

<div id="<portlet:namespace />fetchData">
...
</div>

<script type="text/javascript">
var url = '<%=fetchDatabase.toString()%>';

$(document).ready(function() {      
    $("#fetchLink").click(function() {
        $.post(url).done(function(data) {
            $("#<portlet:namespace />fetchData").html(data);
        }); 
    });
});

注意:我仅在您的示例fetchData上使用此功能,但尚未在fetchLink上使用 - 现在您知道出了什么问题,这将是您的任务:)

正如您在评论中所述,对于最终作为DOM中的全局变量的变量名称也是如此:请注意它们最终共享相同的HTML文档 - 解决此问题的一种方法是使用{ {1}}也“装饰”变量名称,但结果代码很丑陋且难以维护。这就是为什么Liferay最终将AlloyUI替换为jQuery的原因之一:AUI默认使用命名空间并启用动态模块加载。在一个名称空间内,您不依赖于全局变量,而是将变量置于该块的本地变量 - 包括您要加载的模块:

<portlet:namespace/>

答案 1 :(得分:1)

通常,在Javascript中,您应该调用<aui:>组件,例如

$('#<portlet:namespace/>aui_component_id')

如果你查看你的html源代码,你会发现所有<aui>组件都在'id'属性中将'portlet_id'作为前缀

另外,我无法理解你是通过使用从actionUrls调用的processAction来完成这项工作的。您需要“资源”阶段来获取数据而不刷新页面,因此您需要覆盖MVCPortlet的serveResource函数,并通过调用resourceUrls在您的jsp中调用它

答案 2 :(得分:0)

谢谢你们所有的反复意见。

我弄清楚问题是什么。

我对两个portlet urls使用相同的变量名称(var url = '<%=workloadUrl.toString()%>'; && var url = '<%=fetchDatabase.toString()%>';)。

我更改了第二个portlet的变量名,现在它正常工作。

我不知道我不能在不同的portlet中使用相同的变量名。