微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ajax – 如何调用portlet.java类的特定方法而不是覆盖serveResource方法?

我想在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();
        }
    }
}

所以我的问题是,现在它只是认来自任何ajax类的@override方法.
但是如何在ajax调用调用portlet.java类的特定方法

我是阿贾克斯的新蜜蜂.所以请你指导我,你可以……

使用以下url调用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) {

}

解决方法

how can I call specific method of portlet.java class on ajax call?

我认为我们不能有两个不同版本的serveResource方法,就像我们为动作方法做的那样,至少不是认实现.

如果你想要不同的方法,你必须采用Spring MVC (@ResourceMapping)方式.

您仍然可以使用resourceId在serveResource方法中定义不同的逻辑,如下所示(a full example):

在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将完全没用.

this comment之后编辑:
您还可以将ajax与action方法一起使用:

人们使用< 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐