Портлет Liferay отображает страницу инициализации после выполнения процесса

1

Я работаю с портлетами и работал над образцом на вики- странице liferay: 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);
    }
}

У меня два 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>

В форме submit of edit.jsp он должен повторно отобразить эту страницу. Когда я просто использую портлет: renderUrl вместо портлета: actionUrl, он делает это правильно, но actionUrl не является повторной рендерингом. В учебнике говорится, что он должен снова визуализировать edit.jsp, поэтому я не уверен, что мне не хватает. Примечание. Он сохраняет все мои параметры правильно.

  • 0
    Используете ли вы Liferay 6.1 или Liferay 6.2? И что происходит вместо рендеринга edit.jsp? Он возвращается в view.jsp, верно?
  • 0
    Мы используем Liferay 6.1.2. Да, он возвращается в view.jsp. Я добавил код actionResponse.setRenderParameter ("mvcPath", "/ edit.jsp") в мой класс java, который правильно его направил, но все равно это не похоже на правильный способ сделать это. Мой параметр init в portlet.xml - это view.jsp, так что он почти как бы заново инициализирует весь портлет.
Теги:
jsp
liferay
portlet

1 ответ

3
Лучший ответ

Согласно JSR 286 (aka Portlet Specification 2.0), PLT.11.1.1.2:

Портлет-контейнер не должен распространять параметры, полученные в запросе действия или события, на последующие запросы визуализации портлета.

Это то, что происходит, когда пользователь нажимает кнопку "Отправить" на странице браузера:

  1. Браузер отправляет запрос действия Liferay, который содержит в качестве параметров "имя" и "mvcPath".
  2. Портлет теперь находится в фазе действия, и поэтому он выполняет метод processAction.
  3. Когда метод processAction завершается без ошибок, Liferay все еще отвечает на запрос Action, и браузер все еще ждет ответа, который будет HTML-страницей текущей страницы.
  4. Поскольку Liferay теперь должен отвечать браузеру HTML-страницей страницы, он вызывает метод render для каждого портлета на странице. То есть, если делает запрос Render этим портлетам.
  5. Для вашего портлета, который является MVCPortlet, метод render считывает параметр "mvcPath", чтобы узнать, какую страницу JSP он должен отображать.

Но теперь JSR 286 говорит, что нет никакого параметра, проходящего между фазами Action и Render, поэтому mvcPath, который был частью запроса Action, не копируется Liferay в запрос Render, который Liferay делает в ваш портлет.

Теперь решения:

  • Как вы processAction, в конце метода processAction (но обычно вы не processAction метод processAction, вместо этого вы создаете разные методы для разных действий, они расскажут вам, как это сделать в учебниках... смотрите на http://dev.liferay.com), вы можете установить actionResponse.setRenderParameter("mvcPath","/edit.jsp"). Это совершенно нормально.
  • Если вы хотите, чтобы ваши параметры действия всегда копировались в последующий запрос Render, который Liferay делает для вашего портлета, вы можете установить copy-request-parameters init copy-request-parameters параметра true (посмотрите здесь)
  • Но вы увидите, что обычно портлеты Liferay возвращаются в представление после выполнения действия "изменить" (передавая параметр "перенаправление" в запросе действия), так что это зависит от вас.

Извините, есть много, чтобы сказать об этом предмете, надеюсь, что то, что я написал, может быть полезно для вас!

  • 0
    Супер полезно. Требуется немного времени, чтобы обдумать, что происходит на этих этапах. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню