下面是我的View.jsp代码
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
<portlet:actionURL name="myAction" var="myAction">
</portlet:actionURL>
<form action="${myAction}" method="POST">
Name : <input type="text" name="name">
<input type="button" value="SUBMIT">
</form>
以下是我的Portlet类代码
package com.generic;
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
/**
* Portlet implementation class FirstGenericDemo
*/
public class FirstGenericDemo extends GenericPortlet {
public void init() {
viewTemplate = getInitParameter("view-template");
}
public void doView(RenderRequest renderRequest, RenderResponse renderResponse)throws IOException, PortletException {
System.out.println("view");
include(viewTemplate, renderRequest, renderResponse);
}
protected void include(String path, RenderRequest renderRequest,RenderResponse renderResponse)throws IOException, PortletException {
PortletRequestDispatcher portletRequestDispatcher =
getPortletContext().getRequestDispatcher(path);
if (portletRequestDispatcher == null) {
_log.error(path + " is not a valid include");
}
else {
portletRequestDispatcher.include(renderRequest, renderResponse);
}
}
protected String viewTemplate;
private static Log _log = LogFactoryUtil.getLog(FirstGenericDemo.class);
@Override
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
System.out.println("ok");
String name=request.getParameter("name");
System.out.println("name is : "+name);
super.processAction(request, response);
}
}
当portlet被渲染时,view方法被调用但是当我点击提交按钮时,既没有调用processAction方法,也没有调用view方法。这些在stacktrace中也没有错误。我通过多次部署尝试过,但问题是一样的。任何人都可以请帮助。 ?
答案 0 :(得分:2)
代码有几个问题。
Ajay建议的重命名将不起作用,因为您使用GenericPortlet作为父级。
要将jsp / html代码与portlet类正确绑定,您需要重命名类并按照Ajay的建议对其进行注释。
@ProcessAction(name=myAction)
public void myAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
//your code
}
另一个选择是将MVCPortlet作为基类。然后重命名就足够了(名称属性需要匹配方法名称)。
第二件不起作用的是参数。如果您不使用aui标记,则需要将命名空间添加到输入名称。在JAVA代码中,您只需通过名称(无名称空间)
来引用参数Name : <input type="text" name="<portlet:namespace/>name">
我建议使用AUI标签。这更容易。
答案 1 :(得分:0)
正如Miroslav Ligas所说,有几个问题。要删除这些问题,您需要在view.jsp以及Portlet类中进行更改。
a)在 view.jsp 中,您需要使用以下代码段
<portlet:actionURL name="myAction" var="myAction">
</portlet:actionURL>
<form action="${myAction}" method="POST">
Name : <input type="text" name="name">
<input type="submit" value="SUBMIT">
</form>
如果您使用的是输入类型=“按钮”,那么在您使用 document.getElementById(“myForm”)。submit(); 之前它将无效你的javascript部分。
b)在 Portlet类
中1)你需要删除 super.processAction(request,response); ,因为它会产生异常。
2)您需要在ProcessAction方法
中添加以下代码段response.setRenderParameter("jspPage","/html/jsps/displayEmployees.jsp");
使用上面的代码片段,以便重定向到某个视图部分(jsp页面),其中/html/jsps/displayEmployees.jsp表示要将其用作视图部分的jsp的路径。
以及我之前建议的更改,例如使用注释 @ProcessAction(name = myAction)或更改操作方法名称将不会被推荐,因为您正在扩展GenericPortlet类rahter然后MVCPortlet类。如果你扩展MVCPortlet类,那么必须使用它们。
更改,例如添加
像<portlet:namespace/>
这样的html标记中的Name : <input type="text" name="<portlet:namespace/>name">
在您的代码段中是可选的。