4

我需要一些关于 ajax 的 liferay 帮助。现在我正在从我的view.jsp页面调用 ajax 方法来提交一些数据。

这是我正在使用的示例代码view.jsp

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

<portlet:actionURL name="AddTest" var="add1" />
<portlet:resourceURL id="AddTest" var="AddTest"></portlet:resourceURL>

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

    <script type="text/javascript">
    function addToDo(addToDo){
        var todo =document.getElementById('toDo').value;
        $.ajax({
            url :addToDo,            
              data: {"todo":todo,"CMD":"addToDo"},
              type: "GET",
              dataType: "text",
            success: function(data) {              
                  $("#toDoList").html(data);
            }
        });
    }
    </script>
</head>

<body>

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

    <form>
        <input type="text" name="toDo" id="toDo">
        <button name="Add" type="button" onclick="addToDo('<%=addToDo%>')">Add</button>
        <div id="toDoList">

        </div>
    </form>
</body>
</html> 

在我的portlet.java课堂上,这个 ajax 调用调用了一种方法:

@Override
public void serveResource(ResourceRequest request, ResourceResponse response){
    if(request.getParameter("CMD").equals("addToDo")) {

        System.out.println("came here for add");

        mediatype userToDo = new mediatypeImpl();
        //userToDo.setMediaId(12345);
        try {
            userToDo.setPrimaryKey((CounterLocalServiceUtil.increment()));
            userToDo.setMedianame(request.getParameter("todo"));
            mediatypeLocalServiceUtil.addmediatype(userToDo);
        }
        catch (SystemException e) {
            e.printStackTrace();
        }
    }
}

所以我的问题是,现在它只是@override从任何 ajax 类中调用默认方法。但是如何portlet.java在 ajax 调用中调用特定的类方法呢?

我是ajax的新蜜蜂。所以请指导我无论如何你可以......

使用以下网址调用 ajax 时出现以下错误

<portlet:actionURL name="ajax_AddAdvertise" var="addToDo" windowState="<%= LiferayWindowState.EXCLUSIVE.toString()%>"> </portlet:actionURL>



06:47:03,705 ERROR [http-bio-8080-exec-23][render_portlet_jsp:154] java.lang.NoSuchMethodException: emenu.advertise.portlet.RestaurantPortlet.ajax_AddAdvertise(javax.portlet.ActionRequest, javax.portlet.ActionResponse)
    at java.lang.Class.getMethod(Class.java:1605)

我的流程操作方法如下

 @ProcessAction(name = "ajax_AddAdvertise")
    public void ajax_AddAdvertise(ResourceRequest request,ResourceResponse response) {

}
4

1 回答 1

10

如何在 ajax 调用中调用 portlet.java 类的特定方法?

我认为我们不能有两个不同版本的serveResource方法,就像我们为操作方法所做的那样,至少没有默认实现。

如果你想要不同的方法,你将不得不采用Spring MVC ( @ResourceMapping)的方式来获得它。

不过,您可以serveResource使用resourceId以下方法在您的方法中定义不同的逻辑(完整示例):

在 JSP 中:

<portlet:resourceURL var="myResourceURL" id="myResourceID01" />

在 portlet 类中,该serveResource方法将包含以下代码:

String resourceID = request.getResourceID();

if(resoureID.equals("myResourceID01")) {
   // do myResourceID01 specific logic
} else {
   // else do whatever you want
}

请记住 [重要]
在 portlet 中您不应该使用<html>, <head>,<body>标记,因为 portlet 生成页面的片段而不是整个页面。即使允许,您的结果页面也不会格式正确,并且在不同浏览器上的行为会有所不同。而且修改 DOM 元素的 javascript 将完全没用。

在此评论后编辑:
您还可以将 ajax 与操作方法一起使用:

人们<portlet:actionURL>通常将 ajax 用于<form>- POST

为此,actionURL在您的 jsp 中以稍微不同的方式生成,如下所示:

<portlet:actionURL name="ajax_AddAdvertise" var="addToDo" windowState="<%= LiferayWindowState.EXCLUSIVE.toString()%>">
</portlet:actionURL>

在您的 portlet 中,您可以拥有(如问题所示):

@ProcessAction(name = "ajax_AddAdvertise")
public void ajax_AddAdvertise(ActionRequest request, ActionResponse response) {
// ... your code
}
于 2012-11-06T12:40:20.800 回答