Liferay doView () portlet after redirection

I have a portlet with several jsp pages, each of which contains a form with a submit button. When the user submits the form on the first jsp, I save the data in db and call actionResponse.sendRedirect()to redirect the user to the next jsp page. I should use redirects to prevent the user from accidentally re-sending data on the next page by pressing F5. Everything works fine, except that after redirecting to the second page, the method doView()does not execute, and I need to load some data there before displaying the page. Is this normal behavior, or am I doing something wrong? Where can I load this data before displaying the second jsp?

First jsp

<%-- ... --%>
<portlet:actionURL name="createNewMyCustomObj" var="createNewMyCustomObjURL" />
<aui:form action="<%= createNewMyCustomObjURL.toString() %> method="post">
    <%-- form fields --%>
    <aui:button type="submit" value="Create" />
</aui:form>

Second jsp

<%
    MyCustomObj obj = (MyCustomObj) renderRequest.getAttribute("myCustomObj");
%>

<portlet:actionURL name="updateMyCustomObj" var="updateMyCustomObjURL" />
<aui:form action="<%= updateMyCustomObjURL.toString() %> method="post">
    <%-- fields with values from myCustomObj --%>
    <aui:button type="submit" value="Update" />
</aui:form>

MyMVCPortlet.java

public class MyMVCPortlet extends MVCPortlet {

    public createNewMyCustomObj(ActionRequest actionRequest,
         ActionResponse actionResponse) throws IOException, PortlalException, SystemException {

        PortletURL redirectURL = null;
        try {
            // get data from request
            // save it to db
            redirectURL = createRedirectURL(actionRequest, "second.jsp");
        } catch(Exception e) {
            SessionErrors.add(actionRequest, "error-key")
            // errors saving data, stay on the same page
            redirectURL = createRedirectURL(actionRequest, "first.jsp");
        }
        actionResponse.sendRedirect(redirectURL.toString());
    }

    private PortletURL createRedirectURL(ActionRequest actionRequest, String jspPage) {
        ThemeDisplay themeDisplay = (ThemeDisplay)         actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
        String portletName = (String) actionRequest.getAttribute(WebKeys.PORTLET_ID);

        PortletURL redirectURL = PortletURLFactoryUtil.create(
            actionRequest, portletName, themeDisplay.getLayout().getPlid(),      PortletRequest.RENDER_PHASE);
        redirectURL.setParameter("jspPage", jspPage);

        return redirectURL;
    }

    @Override
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        /*
         * doView() is never called after redirecting to second.jsp
         */
        if(/* second jsp page */) {
            // get myCustomObj created previously
            renderRequest.setAttribute("myCustomObj", myCustomObj);
        }
        super.doView(renderRequest, renderResponse);
    }
}
+4
1

MVCPortlet.doDispatch(RenderRequest renderRequest, RenderResponse renderResponse) MVCPortlet - , mvcPath jspPage, doDispatch doView JSP.

doView , doView. include(path, renderRequest, renderResponse); doView, path JSP.

- :

MyMVCPortlet.java

public class MyMVCPortlet extends MVCPortlet {
    //...        

    private PortletURL createRedirectURL(ActionRequest actionRequest, String jspPage) {
        ThemeDisplay themeDisplay = (ThemeDisplay)         actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
        String portletName = (String) actionRequest.getAttribute(WebKeys.PORTLET_ID);

        PortletURL redirectURL = PortletURLFactoryUtil.create(
            actionRequest, portletName, themeDisplay.getLayout().getPlid(),      PortletRequest.RENDER_PHASE);
        redirectURL.setParameter("viewName", jspPage); // note the changed parameter name

        return redirectURL;
    }

    @Override
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {

        if(/* ... */) {
            // ...
        }
        String requestedView = renderRequest.getParameter("viewName");
        if (StringUtils.isBlank(requestedView)) { // StringUtils comes from commons-lang
            include(viewTemplate, renderRequest, renderResponse); // viewTemplate is a protected variable, which may also be called viewJSP depending on Liferay version I think
        } else {
            include(requestedView, renderRequest, renderResponse);
        }
    }
}
+6

All Articles