我正在使用 portlet,并且正在研究 liferay 的 wiki 上的示例:https://www.liferay.com/documentation/liferay-portal/6.1/development/-/ai/writing-the-my-greeting-portl-4
我在处理表单后重定向回 init jsp 时遇到了一些问题。我的 Java 类是:
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;
import com.liferay.util.bridges.mvc.MVCPortlet;
public class Directory extends MVCPortlet {
@Override
public void processAction(
ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException, PortletException {
PortletPreferences prefs = actionRequest.getPreferences();
String greeting = actionRequest.getParameter("greeting");
if (greeting != null) {
prefs.setValue("greeting", greeting);
prefs.store();
}
super.processAction(actionRequest, actionResponse);
}
}
我有两个 jsp。查看.jsp:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ page import="javax.portlet.PortletPreferences" %>
<portlet:defineObjects />
<%
PortletPreferences prefs = renderRequest.getPreferences();
String greeting = (String)prefs.getValue(
"greeting", "Hello! Welcome to our portal.");
%>
<p><%= greeting %></p>
<portlet:renderURL var="editGreetingURL">
<portlet:param name="mvcPath" value="/edit.jsp" />
</portlet:renderURL>
<p><a href="<%= editGreetingURL %>">Edit greeting</a></p>
和编辑.jsp:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@ page import="com.liferay.portal.kernel.util.ParamUtil" %>
<%@ page import="com.liferay.portal.kernel.util.Validator" %>
<%@ page import="javax.portlet.PortletPreferences" %>
<portlet:defineObjects />
<%
PortletPreferences prefs = renderRequest.getPreferences();
String greeting = (String)prefs.getValue(
"greeting", "Hello! Welcome to our portal.");
%>
<portlet:actionURL var="editGreetingURL">
<portlet:param name="mvcPath" value="/edit.jsp" />
</portlet:actionURL>
<aui:form action="<%= editGreetingURL %>" method="post">
<aui:input label="greeting" name="greeting" type="text
value="<%=greeting%>
<aui:button type="submit" />
</aui:form>
<portlet:renderURL var="viewGreetingURL">
<portlet:param name="mvcPath" value="/view.jsp" />
</portlet:renderURL>
<p><a href="<%= viewGreetingURL %>">← Back</a></p>
在 edit.jsp 的表单提交上,它应该重新呈现该页面。当我只使用 portlet:renderUrl 而不是 portlet:actionUrl 时,它会正确执行,但 actionUrl 不会重新呈现。该教程说它应该再次呈现 edit.jsp,所以我不确定我遗漏了什么。注意:它正确保存了我的所有参数。
最佳答案
根据JSR 286 (又名 Portlet 规范 2.0),PLT.11.1.1.2:
The portlet-container must not propagate parameters received in an action or event request to subsequent render requests of the portlet.
这是当用户点击浏览器页面上的提交按钮时发生的情况:
- 浏览器向 Liferay 发送一个Action 请求,其中包含作为其参数的“name”和“mvcPath”。
- Portlet 现在处于 Action 阶段,因此它执行
processAction
方法。 - 当
processAction
方法无错终止时,Liferay 仍在响应 Action 请求,浏览器仍在等待响应,这将是当前页面的 HTML。 - 因为 Liferay 现在必须用页面的 HTML 响应浏览器,它会为页面中的每个 portlet 调用
render
方法。也就是说,如果向这些 portlet 发出Render 请求。 - 对于您的 portlet,它是一个
MVCPortlet
,render
方法读取“mvcPath”参数以找出它必须呈现哪个 JSP 页面。
但是现在,JSR 286 表示在 Action 和 Render 阶段之间没有传递参数,所以 mvcPath
是Action 请求的一部分,不会被 Liferay 复制到 Liferay 对您的 portlet 发出的Render 请求。
现在,解决方案:
- 正如您所建议的,在
processAction
方法的末尾(但通常您不会更改processAction
方法,而是为不同的操作创建不同的方法,它们我会在教程中告诉您如何操作...请查看 http://dev.liferay.com),您可以设置actionResponse.setRenderParameter("mvcPath","/edit.jsp")
。这是完全正常的。 - 如果您希望您的Action 参数始终被复制到 Liferay 对您的 portlet 发出的后续 Render 请求,您可以设置
copy-request- parameters
初始化参数为true
(看看here) - 但是您会发现 Liferay portlet 通常会在执行“编辑”操作(在操作 请求中传递“重定向”参数)后返回到 View ,所以这取决于您。
不好意思,这个话题说的有点多,希望我写的对你有用!
关于java - Liferay portlet 在 processAction 之后重新呈现初始页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28074397/