2016-08-31 2 views
0

У меня есть страница Struts 2 с 2 DisplayTag таблицами, каждая из которых имеет List<T>. Этот номер List<T> заполнен кодом и может составлять пару тысяч записей. На странице я могу выбрать строки любой из таблиц и нажать кнопку, чтобы переместить их из одной таблицы в другую. Это можно сделать несколько раз, прежде чем, наконец, нажать еще одну кнопку, чтобы сохранить содержимое одной из таблиц в базе данных. Я хочу сделать оба эти действия в действии через AJAX.В Struts2, как я сохраняю данные между двумя действиями?

userGroupEditmembers.jsp (извинения за избытка пробелов, остаток с помощью выбора блока в Eclipse)

<table> 
    <tr> 
     <td> 
      <p class="collectionAlt"> 
       <s:text name="overview.groupMembers" /> 
      </p> 
      <s:set name="groupMembers" value="groupMembers" scope="request" /> 
      <display:table name="groupMembers" uid="row" excludedParams="*" cellspacing="1" cellpadding="1"> 
       <%-- include localized messages for the table's banner --%>      
       <%@ include file="/jsp/includesstruts2/displayTagBanner.jsp"%> 

       <display:column sortable="false" headerClass="listHeader"> 
        <s:checkbox name="groupMemberOids" fieldValue="%{#attr.row.oid}" theme="simple" />              
       </display:column>                
       <%-- User Name --%> 
       <display:column property="userId" titleKey="label.user.userId" headerClass="listHeader" />             

       <%-- User Name --%> 
       <display:column property="name" titleKey="label.user.name" headerClass="listHeader" />             

       <%-- Whether the User is archived --%>           
       <display:column titleKey="label.user.archived" headerClass="listHeader"   
        class="iconColumn">               
        <s:if test="%{#attr.row.archived}">           
         <img src="<s:url value='/images/checkedWarning.gif'/>" border="0" />  
        </s:if>                  
       </display:column>                
      </display:table>                  
     </td>                     
     <td>                      
      <%-- 'Remove Users from Group' button --%>           
      <input value="&gt;&gt;" type="button" id="removeUsersButton" /> <br />    
      <br />                    
      <%-- The 'Refresh' button. Used to reload the issueTrackingSystemEditDialog.jsp --%> 
      <input value="&lt;&lt;" type="button" id="addUsersButton" />       
     </td>                     
     <td>                      
      <p class="collectionAlt">               
       <s:text name="overview.nonGroupMembers" />          
      </p>                     
      <s:set name="nonGroupMembers" value="nonGroupMembers" scope="request" />    

      <display:table name="nonGroupMembers" uid="row" excludedParams="*"     
       cellspacing="1" cellpadding="1">             
       <%-- include localized messages for the table's banner --%>      
       <%@ include file="/jsp/includesstruts2/displayTagBanner.jsp"%>     

       <display:column sortable="false" headerClass="listHeader">      
        <s:checkbox name="nonGroupMemberOids" fieldValue="%{#attr.row.oid}"   
         theme="simple" />              
       </display:column>                
       <%-- User Name --%>                
       <display:column property="userId" titleKey="label.user.userId"     
        headerClass="listHeader" />             

       <%-- User Name --%>                
       <display:column property="name" titleKey="label.user.name"      
        headerClass="listHeader" />             

       <%-- Whether the User is archived --%>           
       <display:column titleKey="label.user.archived" headerClass="listHeader"   
        class="iconColumn">               
        <s:if test="%{#attr.row.archived}">           
         <img src="<s:url value='/images/checkedWarning.gif'/>" border="0" />  
        </s:if>                  
       </display:column>                
      </display:table>                  
     </td>                     
    </tr>                      
</table>                       
<s:token />                      


<s:hidden name="oid" />                   
<s:hidden name="version" />                  
<s:hidden name="groupMembersJson" />                
<s:hidden name="nonGroupMembersJson" /> 

UserGroupEditMembersAction.java:

private Integer oid; 
private Integer version; 

private List<UserView> groupMembers; 

private List<UserView> nonGroupMembers; 

private String groupMembersJson; 

private String nonGroupMembersJson; 

private Integer[] groupMemberOids; 

private Integer[] nonGroupMemberOids; 

private Boolean showArchived; 

/** 
* method for DisplayUserGroupEdit action. 
* 
* @return 
* @throws Exception 
*/ 
public String display() throws Exception { 
    if (showArchived == null) { 
     showArchived = false; 
    } 
    UserService userService = (UserService) ServiceFactory.getInstance().createService(UserService.class); 
    List<List<UserView>> usersForUserGroup = userService.getUsers(oid, showArchived); 
    groupMembers = usersForUserGroup.get(0); 
    nonGroupMembers = usersForUserGroup.get(1); 
    groupMembersJson = serializeToJsonString(groupMembers); 
    nonGroupMembersJson = serializeToJsonString(nonGroupMembers); 

    return SUCCESS; 
} 

public String addMembers() throws Exception { 
    groupMembers = (List<UserView>) deserializeFromJsonString(groupMembersJson); 
    nonGroupMembers = (List<UserView>) deserializeFromJsonString(nonGroupMembersJson); 
    UserService userService = (UserService) ServiceFactory.getInstance().createService(UserService.class); 
    for (Integer userOid : nonGroupMemberOids) { 
     UserView userview = userService.getUser(userOid); 
     groupMembers.add(userview); 
     for(int i = 0; i< nonGroupMembers.size(); i++){ 
      UserView view = nonGroupMembers.get(i); 
      if(view.getOid().equals(userOid)){ 
       nonGroupMembers.remove(i); 
       break; 
      } 
     } 
    } 
    groupMembersJson = serializeToJsonString(groupMembers); 
    nonGroupMembersJson = serializeToJsonString(nonGroupMembers); 
    return SUCCESS; 
} 

public String removeMembers() throws Exception { 
    groupMembers = (List<UserView>) deserializeFromJsonString(groupMembersJson); 
    nonGroupMembers = (List<UserView>) deserializeFromJsonString(nonGroupMembersJson); 
    UserService userService = (UserService) ServiceFactory.getInstance().createService(UserService.class); 
    for (Integer userOid : groupMemberOids) { 
     UserView userview = userService.getUser(userOid); 
     nonGroupMembers.add(userview); 
     for(int i = 0; i< groupMembers.size(); i++){ 
      UserView view = groupMembers.get(i); 
      if(view.getOid().equals(userOid)){ 
       groupMembers.remove(i); 
       break; 
      } 
     } 
    } 
    groupMembersJson = serializeToJsonString(groupMembers); 
    nonGroupMembersJson = serializeToJsonString(nonGroupMembers); 
    return SUCCESS; 
}              

У меня есть проблема в том, что, когда я перемещая элементы из одного списка в другой список, мне нужен доступ к спискам, которые в настоящее время используются в таблицах. Поскольку действия Struts2 не имеют статуса, мне нужно сохранить эти списки между двумя действиями.

  • Я пробовал только иметь списки в блоке <s: hidden />, но это не может быть легко преобразовано обратно.
  • Моя текущая попытка - сериализовать их в JSON с помощью методов JSONUtil.serialize и JSONUtil.deserialize, но по какой-то причине десериализует их до List<HashMap> вместо List<T>.
  • Я предложил своему коллеге использовать сессию, но он обеспокоен потерями производительности.

Каков наилучший способ справиться с этим?

+1

use session - why not ... – Plirkee

+0

@Plirkee Мой коллега обеспокоен тем, что, поскольку сеанс уникален для каждого пользователя, хранение потенциально очень длинных списков может вызвать нехватку памяти. – Nzall

+0

мой контраргумент заключался бы в том, что существуют некоторые рамки, которые в значительной степени зависят от сеанса для хранения информации (например, jsf). Разумеется, размер информации имеет значение ... – Plirkee

ответ

0

Цепочка действий - правильный путь. Я использую аннотацию, поэтому код выглядит так.

@Action(
      value = "/loginAction", 
      results = { 
        @Result(name = "car_user", type="chain", params = {"actionName", "getAllUserAction", "loginUser", "${loginUser}"}), 

....................

Где loginUser является переменной, имеющей сеттер геттер в классе loginAction и класс цепь attion который имеет ActionName getAllUserAction получит его в переменной loginUser Variable этого класса, у которого есть установочный getter для того же самого.

+0

Цепочка действий не поощряется, хотя –

 Смежные вопросы

  • Нет связанных вопросов^_^