У меня есть страница 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=">>" type="button" id="removeUsersButton" /> <br />
<br />
<%-- The 'Refresh' button. Used to reload the issueTrackingSystemEditDialog.jsp --%>
<input value="<<" 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>
. - Я предложил своему коллеге использовать сессию, но он обеспокоен потерями производительности.
Каков наилучший способ справиться с этим?
use session - why not ... – Plirkee
@Plirkee Мой коллега обеспокоен тем, что, поскольку сеанс уникален для каждого пользователя, хранение потенциально очень длинных списков может вызвать нехватку памяти. – Nzall
мой контраргумент заключался бы в том, что существуют некоторые рамки, которые в значительной степени зависят от сеанса для хранения информации (например, jsf). Разумеется, размер информации имеет значение ... – Plirkee