我的Liferay portlet中没有触发Ajax

时间:2015-10-25 08:15:25

标签: ajax liferay portlet

我有一个MVCPortlet,我尝试在jsp页面中调用ajax。

我的jsp如下:

<%@include file="/html/init.jsp"%>

<portlet:resourceURL var="updateRatAjax" id="updateRatAjax" ></portlet:resourceURL>


<script type="text/javascript">

function selectRat(){

    var rat = new Object();
    rat.nom = $('#ratsList').val();

    alert(rat.nom + ' '/* + portletURL*/);


    $.ajax({

        url: "${updateRatAjax}" ,
        type: 'POST',
        dataType: 'json',
        data: JSON.stringify(article),
        contentType: 'application/json',
        mimeType: 'application/json',

        success: function (data) {
            alert('ajax' + article.nom);
            }
    });

    alert('end of function');
}
</script>
....

    <select  class="offset2 span4 form-control"  name=ratsList id = ratsList onchange="selectRat()">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>

    <input  name = "selectedRat" id ="selectedRat"></input>

我的控制器portlet资源如下:

public class MainControllerPortlet extends  MVCPortlet {
...
    public void updateRatAjax( ResourceRequest request, ResourceResponse response)
            throws IOException, PortletException {
        System.out.println(" updateRatAjax");

    }
}

我也尝试将这个url调用到js函数中:

  url:"<%= updateRatAjax %>",

 var portletURL = "<%= updateRatAjax %>";
   url: portletURL,
没有机会。       alert(rat.nom + ' '/* + portletURL*/); oes显示 但是,当调用$ .ajax({...})时,js方法必须停止。

该问题可能与应用程序无法使用updateRatAjax方法映射resourceURL有关。 在这个项目中,actionURL被正确地映射到控制器的方法,而我没有在web.xml中映射它们,也没有使用任何分配。 我认为我不需要映射portlet:resourceURL,但我可能错了。我第一次使用portlet:resourceURL所以我对它们一无所知。

提前帮助你。

编辑: 在Sudakatux的回答之后,我将JS功能更改为: ...

 var portletURL = "${updateRatAjax}"; // "<%= updateRatAjax %>";//working  // 
  alert(rat.nom + '\n ' +   portletURL); //portletURL displays correctly with both options on previous line

    $.ajax({

        url: portletURL ,
        type: 'POST',
        dataType: 'text',
        cache: false,
        success: function (data) {
            alert('success ajax' );
            }, 
        error: function(http, message, exc) { 
           alert('error ajax'); 
       }

    });

奇怪的是,我得到了成功消息,但从未调用过控制器方法:

public void updateRatAjax( ResourceRequest request, ResourceResponse response)
        throws IOException, PortletException {
//public void updateRatAjax(ActionRequest request, ActionResponse response)        throws  PortalException, SystemException {
    System.out.println("MainController portlet : updateRatAjax");
}

3 个答案:

答案 0 :(得分:3)

试一试

<portlet:resourceURL var="timeSyncURL" id="serverTimeSync" />

<script type="text/javascript">
var serverTimeFunction = function serverTime() { 
var time = null; 
    $.ajax({url: '<%=timeSyncURL.toString() %>', 
 async: false, dataType: 'text', 
 success: function(text) { 
    console.log("updated time "+ text);
     time = new Date(Number(text)); 
     console.log("time is "+time);
 }, error: function(http, message, exc) { 
     time = new Date(); 
}}); 

所以我在这里调用一个与updateRatAjax方法具有相同签名的服务。并且对我来说工作正常

这是一个不太优雅的选择,但它应该可行 覆盖serveResource方法

@Override
        public void serveResource(ResourceRequest resourceRequest,
                ResourceResponse resourceResponse)
            throws  IOException, PortletException {

if(resourceRequest.getResourceID().equals("serverTimeSync")){
                 PrintWriter out = resourceResponse.getWriter();

                 out.println(new Date().getTime());
}

serveResource用于AJAX调用,所以这肯定会有效。

答案 1 :(得分:2)

  

是的,你是对的,你的AJAX电话(resourceURL)没有得到   在动作类中使用适当的侦听器进行映射。

问题在于你非常注重基于默认MVC portlet的var属性将AJAX调用链接到控制器的特定方法,就像我们在Spring MVC portlet中使用{{1注释。

请参阅Multiple Ajax calls liferay portlets

中的以下几行
  

在此添加更多内容。我们不能使用@ResourceMapping("xxx")方法   serveResource。单个Liferay中可以有多个processAction   portlet(这不是Spring MVC portlet),而在这种情况下   processAction它将是单身。

现在,只需覆盖serveReource,如下所示:

serveResource

此外,如果您有多个AJAX调用,则有两个选项:

<强> 1。在将public void serveResource( ResourceRequest request, ResourceResponse response) throws IOException, PortletException { System.out.println(" updateRatAjax"); } 属性添加到resourceRequest.getResourceID()标记后,使用serveResource中的id过滤请求,例如:

<portlet:resourceURL>

<强> 2。通过<portlet:resourceURL id="updateRatAjax" ></portlet:resourceURL> public void serveResource( ResourceRequest request, ResourceResponse response) throws IOException, PortletException { if(resourceRequest.getResourceID().equals("updateRatAjax")){ System.out.println(" updateRatAjax"); } } 或AJAX <portlet:resourceURL>使用其他参数过滤请求:

data

<portlet:resourceURL>
    <portlet:param name="action" value="updateRatAjax" />
</portlet:resourceURL>

<强>控制器:

data: {
    article: JSON.stringify(article),
    action: 'updateRatAjax'
},

答案 2 :(得分:1)

对我来说很好 - 一些健全性检查:

  • 日志中的任何内容?
  • 您提及alert(rat.nom + ' '/* + portletURL*/);但未提及alert(rat.nom + portletURL);(当然还有初始var portletURL = "<%= updateRatAjax %>";
  • 你的init.jsp是否包含portlet taglib并且可用吗?您可能只想包含在您的页面上,以便打印它并且您可以检查它
  • 或者:这个JSP生成的HTML代码是什么? (为了解决Liferay的缩小器问题,请在网址中添加?strip=0 - 这样可以更轻松地阅读。
  • 这是一个与其他portlet共享页面的portlet。您确定您使用的ID不会干扰任何其他portlet的ID吗?