Liferay portlet在processAction之后重新呈现init页面

时间:2015-01-21 18:37:00

标签: java jsp liferay portlet

我正在使用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,所以我不确定我错过了什么。注意:它正确保存我的所有参数。

1 个答案:

答案 0 :(得分:3)

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

  

portlet-container不得传播在a中收到的参数   对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页面。
  6. 但是现在,JSR 286说 Action Render 阶段之间没有参数传递,所以mvcPath是其中的一部分。 Liferay不会将操作请求复制到Liferay对您的portlet发出的 Render 请求。

    现在,解决方案:

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

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