将参数从动作类传递到Liferay中的视图页面时出现问题

时间:2015-09-13 07:30:19

标签: java jsp liferay liferay-6 liferay-theme

我有一个视图页面,我有一个从Excel工具栏导入用户的按钮,所以单击导入用户按钮我在我的portlet操作类中调用以下方法,这里我正在迭代列表并调用用户创建方法来创建用户。现在我可以在数据库中创建用户了。但我需要显示哪些用户已创建,哪些用户未在我的status.jsp中创建,即;用户创建后,我需要导航到状态页面并显示哪些是创建的,哪些不是。

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

我的行动班,

  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中迭代列表并以表格格式显示。

提前致谢

1 个答案:

答案 0 :(得分:1)

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

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

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