我需要一些有关ajax的liferay方面的帮助。现在,我正在从view.jsp页面调用ajax方法来提交一些数据。
view.jsp
这是我正在使用的示例代码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调用所调用:
portlet.java
@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调用中调用类的特定方法?
@override
我是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) { }
如何在ajax调用中调用portlet.java类的特定方法?
我认为我们不可能有两个不同版本的serveResource方法,就像我们对动作方法所做的那样,至少没有默认实现。
serveResource
如果要使用其他方法,则必须采用Spring MVC(@ResourceMapping)的方法。
@ResourceMapping
不过,您仍然可以serveResource使用resourceId以下示例(完整的示例)在方法中定义不同的逻辑:
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>因为门户标签生成页面的片段,而不是整个页面。即使允许,结果页面的格式也不正确,并且在不同的浏览器上的行为也会有所不同。而且,修改DOM元素的JavaScript将完全没有用。
<html>
<head>
<body>
在此评论之后进行编辑: 您还可以将ajax与操作方法一起使用:
人们<portlet:actionURL>通常将Ajax用于<form>- POST。
<portlet:actionURL>
<form>
POST
为此actionURL,在jsp中以稍微不同的方式生成,如下所示:
actionURL
<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 }