【问题标题】:Liferay portlet rerenders init page after processActionLiferay portlet 在 processAction 之后重新呈现初始化页面
【发布时间】:2015-01-21 18:37:00
【问题描述】:

我正在使用 portlet,并且正在研究 liferay 的 wiki 上的示例:https://www.liferay.com/documentation/liferay-portal/6.1/development/-/ai/writing-the-my-greeting-portl-4

在处理表单后,我遇到了一些关于 portlet 重定向回 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);
    }
}

我有两个 jsps。 view.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>

还有edit.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 %>">&larr; Back</a></p>

在edit.jsp 的表单提交上,它应该重新呈现该页面。当我只使用 portlet:renderUrl 而不是 portlet:actionUrl 时,它会正确执行,但 actionUrl 不会重新呈现。该教程说它应该再次呈现edit.jsp,所以我不确定我错过了什么。注意:它正确保存了我的所有参数。

【问题讨论】:

  • 您使用的是 Liferay 6.1 还是 Liferay 6.2?而不是渲染edit.jsp会发生什么?它返回到 view.jsp,对吧?
  • 我们使用的是 Liferay 6.1.2。是的,它返回到 view.jsp。我将代码 actionResponse.setRenderParameter("mvcPath","/edit.jsp") 添加到我的 java 类中,它正确地引导了它,但这似乎仍然不是正确的方法。我在 portlet.xml 中的 init 参数是 view.jsp,所以它几乎就像是在重新初始化整个 portlet。

标签: java jsp liferay portlet


【解决方案1】:

根据JSR 286(又名 Portlet 规范 2.0),PLT.11.1.1.2:

portlet-container 不能传播接收到的参数 对 portlet 的后续呈现请求的操作或事件请求。

这是当用户点击浏览器页面上的提交按钮时发生的情况:

  1. 浏览器向 Liferay 发送 Action 请求,其中包含“name”和“mvcPath”作为其参数。
  2. portlet 现在处于 Action 阶段,因此它执行processAction 方法。
  3. processAction 方法无错误终止时,Liferay 仍在响应 Action 请求,浏览器仍在等待响应,这将是当前页面的 HTML。
  4. 因为 Liferay 现在必须用页面的 HTML 响应浏览器,所以它为页面中的每个 portlet 调用 render 方法。也就是说,如果向这些 portlet 发出 Render 请求。
  5. 对于您的 portlet,它是一个 MVCPortletrender 方法读取“mvcPath”参数以找出它必须呈现的 JSP 页面。

但是现在,JSR 286 表示在 ActionRender 阶段之间没有参数传递,所以 mvcPath 的一部分>Action 请求,Liferay 不会将其复制到 Liferay 向您的 portlet 发出的 Render 请求中。

现在,解决方案:

  • 正如您所建议的,在processAction 方法的末尾(但通常您不会更改processAction 方法,而是为不同的操作创建不同的方法,他们会在教程中告诉您如何操作...看看http://dev.liferay.com),你可以设置actionResponse.setRenderParameter("mvcPath","/edit.jsp")。这是完全正常的。
  • 如果您希望您的 Action 参数始终复制到 Liferay 对您的 portlet 发出的后续 Render 请求,您可以将 copy-request-parameters init 参数设置为 @ 987654334@(看看here
  • 但是您会看到,通常 Liferay portlet 在执行“编辑”操作(在 操作 请求中传递“重定向”参数)后会返回视图,所以这取决于您。

对不起,关于这个话题有很多话要说,希望我写的对你有用!

【讨论】:

  • 超级有帮助。我需要一点时间来思考这些阶段中发生的一切。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多