我有一个带有几个jsp页面的portlet,每个页面都包含一个带有提交按钮的表单.当用户在第一个jsp上提交表单时,我将数据保存在db中并调用actionResponse.sendRedirect()以将用户转发到下一个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)方法 – 在我看来,如果mvcPath或jspPage参数随请求一起发送,那么doDispatch方法完全忽略doView方法并直接路由到JSP页面.
我想在每个portlet渲染上运行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);
}
}
}
