You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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设置,避免会话污染

扩展到编辑、删除操作

对于组织的编辑、删除操作,只需复用相同逻辑:

  1. 在对应操作的actionURL中添加returnMVCPath参数(比如/editOrganization.jsp或/viewOrganizations.jsp)
  2. 在对应的Action方法中获取参数并生成RenderURL重定向即可

内容的提问来源于stack exchange,提问作者SnIpEr ReLoAdEd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:09:50