gpt4 book ai didi

jsp - 重定向后的 Liferay portlet doView()

转载 作者:行者123 更新时间:2023-12-03 04:58:30 26 4
gpt4 key购买 nike

我有一个带有几个 jsp 页面的 portlet,每个页面都包含一个带有提交按钮的表单。当用户在第一个 jsp 上提交表单时,我将数据保存在 db 中并调用 actionResponse.sendRedirect() 将用户转发到下一个 jsp 页面。我必须使用重定向,以防止用户意外地按 F5 在下一页上重新提交相同的数据。一切工作正常,除了重定向到第二页后, doView() 方法未执行,并且我需要在渲染页面之前加载一些数据。这是正常行为还是我做错了什么?在渲染第二个 jsp 之前我可以在哪里加载该数据?

第一个jsp

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

第二个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);
}
}

最佳答案

看一下 MVCPortlet 中的 MVCPortlet.doDispatch(RenderRequest renderRequest, RenderResponse renderResponse) 方法 - 在我看来,如果 mvcPathjspPage 参数随请求一起发送,然后 doDispatch 方法完全忽略 doView 方法并直接路由到 JSP 页面。

如果您想在每个 portlet 渲染上运行 doView 方法,那么我建议忽略这些参数并在您的 doView 中自行进行路由。只需在 doView 末尾调用 include(path, renderRequest, renderResponse); 方法,其中 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);
}
}
}

关于jsp - 重定向后的 Liferay portlet doView(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25116210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com