将参数从操作 class 传递到 Liferay 中的查看页面时出现问题

Issue while passing the parameters from action class to view page in Liferay

我有一个视图页面,其中有按钮可以从 excel sheet 中导入用户,因此单击导入用户按钮后,我将在我的 portlet 操作中调用以下方法 class,这里我是迭代列表,调用用户创建方法来创建用户。现在我可以在数据库中创建用户了。但是我需要在我的 status.jsp 中显示创建了哪些用户,哪些用户没有创建,即;创建用户后,我需要导航到状态页面并显示已创建和未创建的用户。

所以我已经在全局声明了两个数组列表,并在一个列表中添加了成功的用户创建,在另一个列表中添加了失败的用户列表,如下所示,但是我遇到了错误,无法添加到数组列表并且无法通过状态页面的数组列表,

我的操作class,

  static ArrayList<String> successList;
    static ArrayList<String> failureList;

      public void addUser(ActionRequest request, ActionResponse response) 
                throws IOException, PortalException, SystemException {
    successList = new ArrayList<String>();
    failureList = new ArrayList<String>();
    while (iterator.hasNext()) {
     userCreation(themeDisplay, serviceContext, values.get(Field.Project_Name), values.get(Field.Project_Status), values.get(Field.Start_Date),
                            values.get(Field.End_Date), values.get(Field.Company_Name), values.get(Field.PM_FirstName), values.get(Field.PM_MiddleName),
                            values.get(Field.PM_LastName), values.get(Field.PM_Email), values.get(Field.PM_Password), values.get(Field.PM_Role), values.get(Field.PM_Status));

    }
      request.setAttribute("successList", successList);      request.setAttribute("failureList", failureList); response.setRenderParameter("mvcPath","/html/status.jsp");

    }
  public static void userCreation(ThemeDisplay themeDisplay, ServiceContext serviceContext,
                String Project_Name, String Project_Status, String Start_Date, String End_Date, String Company_Name,
                String FirstName, String MiddleName, String LastName, String Email, String Password,
                String Role, String Status) throws PortalException, SystemException
        {
     String result = null;
      try {
                    System.out.println("Try Bolck Start");

                    User newUser = UserLocalServiceUtil.addUser(creatorUserId, companyId, autoPassword, Password,
                            Password, autoScreenName, screenName, Email, facebookId, openId,
                            locale, FirstName, MiddleName, LastName, prefixId, suffixId, male,
                            birthdayMonth, birthdayDay, birthdayYear, role, groupIds,
                            organizationIds, roleIds, userGroupIds, sendEmail, serviceContext);

                    long newUserID = newUser.getUserId();
        result = "The User "+ Email + " is created ";
                    successList.add(result);

            } catch(Exception e){

                    result = "The User "+ Email + " is not created ";
                    failureList.add(result);
            }   
    }

Status.jsp:

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<portlet:defineObjects />

<%
String success = (String)request.getAttribute("successList");
String failure = (String)request.getAttribute("failureList");
if(success!= null && !success.isEmpty())
{
    out.println("Following users are created successfully");
    out.println(success);   
    out.println();
}
if(failure!= null && !failure.isEmpty())
{
    out.println("Following users are not created ");
    out.println(failure);
    out.println();
}

%>

另外,如何将我的列表作为列表而不是字符串发送,以便我可以在 status.jsp 中迭代列表并以 table 格式显示。

提前致谢

当不止一个用户尝试通过此操作添加用户时,portlet class 中的两个静态列表可能会导致争用问题。

一个好的建议是在操作完成后重定向用户,这样就无法通过刷新页面再次触发操作。 因此,您不能将这两个列表作为请求属性传递,因为重定向后发生的渲染将触发新的请求,因此您设置的属性将消失。

Liferay 通过使用用户会话对象将操作中的成功和错误消息传递到重定向后的后续 portlet 呈现。我想使用会话是将您的两个列表传递到渲染阶段的一个不错的选择。