现在我从我的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类的特定方法?
我是阿贾克斯的新蜜蜂.所以请你指导我,你可以……
<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] 举报,一经查实,本站将立刻删除。