Liferay Portlet执行CRUD操作后如何保持在当前页面?
问题:组织CRUD操作后无法停留在当前页面,总是跳转到新增用户页面
我开发了一个包含用户与组织CRUD操作的Portlet,但执行组织的新增、编辑或删除操作后,页面会被重定向到新增用户页面。需要实现每次操作后停留在当前页面。
尝试过的无效方案
LastPath方法(无效)
HttpSession httpSession = httpServletRequest.getSession(); User user = UserLocalServiceUtil.fetchUser(UserId); LastPath last_path = new LastPath("http://localhost:8080/web/my-site/one?p_p_id=my_registration_form_MyRegistrationFormPortlet_INSTANCE_HQMU9wIdWhH5&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_my_registration_form_MyRegistrationFormPortlet_INSTANCE_HQMU9wIdWhH5_mvcPath=%2FaddOrganization.jsp"," "); httpSession.setAttribute(WebKeys.LAST_PATH, last_path);
Request Dispatcher方法(无效)
未生效,无对应代码示例。
可用但有缺陷的方案
sendRedirect方法(可工作但登出后失效)
actionResponse.sendRedirect("http://localhost:8080/web/my-site/one?p_p_id=my_registration_form_MyRegistrationFormPortlet_INSTANCE_HQMU9wIdWhH5&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_my_registration_form_MyRegistrationFormPortlet_INSTANCE_HQMU9wIdWhH5_mvcPath=%2FaddOrganization.jsp");
缺陷:登出后重新登录该方法失效,推测与硬编码Portlet实例ID有关。
补充代码
新增组织的处理方法
// For Adding Organizations @ProcessAction(name = "addOrganization") public void addOrganization(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException { long UserId = themeDisplay.getUserId(); String organizationName = ParamUtil.getString(actionRequest, "organizationName"); String country = ParamUtil.getString(actionRequest, "country"); String type = "organization"; long countryId = ParamUtil.getLong(actionRequest, "countryId"); long statusId = ParamUtil.getLong(actionRequest, "statusId"); try { Organization organization = OrganizationLocalServiceUtil.addOrganization(UserId, 0, organizationName, type, 0,countryId, 12017, null, false, null); } catch (Exception ex) { ex.printStackTrace(); } }
view.jsp中的代码
<!-- For Displaying Add Organization Page --> <portlet:renderURL var = "addOrganizations"> <portlet:param name = "mvcPath" value = "/addOrganization.jsp"/> </portlet:renderURL>
addOrganization.jsp中的代码
<!-- For Displaying Add Organization Page --> <portlet:renderURL var = "addOrganizations"> <portlet:param name = "mvcPath" value = "/addOrganization.jsp"/> </portlet:renderURL> <!-- For redirecting to the addOrganization method in MyRegistrationFormPortlet --> <portlet:actionURL var = "addOrganization_actionURL"> <portlet:param name = "javax.portlet.action" value = "addOrganization"/> </portlet:actionURL> <form> // my form </form>
可行解决方案
核心思路是动态生成返回URL,避免硬编码Portlet实例ID,同时明确指定操作后返回的页面路径。
步骤1:在表单提交时传递当前页面的mvcPath
修改addOrganization.jsp中的actionURL,添加returnMVCPath参数:
<portlet:actionURL var = "addOrganization_actionURL"> <portlet:param name = "javax.portlet.action" value = "addOrganization"/> <portlet:param name = "returnMVCPath" value = "/addOrganization.jsp"/> </portlet:actionURL>
步骤2:在Action方法中动态生成返回的RenderURL
修改addOrganization方法,添加页面返回逻辑:
@ProcessAction(name = "addOrganization") public void addOrganization(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException { // 原有业务逻辑保持不变 long UserId = themeDisplay.getUserId(); String organizationName = ParamUtil.getString(actionRequest, "organizationName"); String country = ParamUtil.getString(actionRequest, "country"); String type = "organization"; long countryId = ParamUtil.getLong(actionRequest, "countryId"); long statusId = ParamUtil.getLong(actionRequest, "statusId"); try { Organization organization = OrganizationLocalServiceUtil.addOrganization(UserId, 0, organizationName, type, 0,countryId, 12017, null, false, null); } catch (Exception ex) { ex.printStackTrace(); } // 新增:处理页面返回逻辑 String returnMVCPath = ParamUtil.getString(actionRequest, "returnMVCPath"); if(StringUtil.isNotEmpty(returnMVCPath)){ // 动态生成RenderURL,自动包含当前Portlet实例ID RenderURL renderURL = actionResponse.createRenderURL(); renderURL.setParameter("mvcPath", returnMVCPath); // 重定向到目标页面 actionResponse.sendRedirect(renderURL.toString()); } }
方案优势
- 动态生成的RenderURL会自动适配当前Portlet实例ID,避免硬编码导致的登出后失效问题
- 通过
returnMVCPath参数明确指定返回页面,逻辑清晰可控 - 无需依赖全局会话的LastPath设置,避免会话污染
扩展到编辑、删除操作
对于组织的编辑、删除操作,只需复用相同逻辑:
- 在对应操作的actionURL中添加
returnMVCPath参数(比如/editOrganization.jsp或/viewOrganizations.jsp) - 在对应的Action方法中获取参数并生成RenderURL重定向即可
内容的提问来源于stack exchange,提问作者SnIpEr ReLoAdEd
相关产品推荐
相关产品推荐

