我在JSP中显示一个列表,如下所示:
<%@page contentType="text/html;charset=UTF-8"language="java"pageEncoding="UTF-8"%>
<%@taglib prefix="s"uri="/struts-tags"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>xxx</title>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<s:form name="tableForm"method="post">
<th>
<s:submit action="verify" key="Add"></s:submit>
</th>
<s:hidden name="propagateList" value="%{formList}"/>
<table border="1">
<tr>
<th >ID</th>
<th>Name</th>
<th>Status</th>
<th>Type</th>
<th>System</th>
</tr>
<s:iterator value="formList">
<tr>
<td><s:checkbox name="checked" fieldValue="%{#attr.ID}" theme="simple" ></s:checkbox>
</td>
<td><s:property value="NAME"/></td>
<td><s:property value="STATUS"/></td>
<td><s:property value="TYPE"/></td>
<td><s:property value="UNIT"/></td>
</tr>
</s:iterator>
</table>
</s:form>
</body>
</html>
这里我想将 formList 列表传递到另一个操作,当我点击添加按钮而不必点击数据库来获取列表 formList 再次。
我尝试使用<s:hidden name="propagateList" value="%{formList}"/>
,但它不起作用。
此列表包含1000多条记录,那么有没有办法在不使用会话的情况下将此列表从jsp传递到Struts 2中的另一个操作?
答案 0 :(得分:5)
回答“如何在不使用Session的情况下将List从ActionA传递给ActionB”的问题:
如果是List<String>
:
<s:iterator value="formList" status="row">
<s:hidden name="formList[%{#row.index}]" />
</s:iterator>
这将迭代整个List,并为List的每个元素生成一个<s:hidden/>
元素;这样,您可以将未更改的List从一个Action传递到另一个。
如果是List<Object>
,那么该对象就是您在页面中发布的内容:
<s:iterator value="formList" status="row">
<s:hidden name="formList[%{#row.index}].id" />
<s:hidden name="formList[%{#row.index}].name" />
<s:hidden name="formList[%{#row.index}].status" />
<s:hidden name="formList[%{#row.index}].type" />
<s:hidden name="formList[%{#row.index}].unit" />
</s:iterator>
正如以前一样,这将迭代整个List,为List的每个对象生成五个元素。
使用此概念,您可以使用交互式标签(文本字段,选择等)而不是只读标签(隐藏,属性等)来更改列表:
<s:iterator value="formList" status="row">
<s:hidden name="formList[%{#row.index}].id" />
<s:textfield name="formList[%{#row.index}].name" value="name" />
<s:hidden name="formList[%{#row.index}].status" />
<s:property value="status" />
<s:textfield name="formList[%{#row.index}].type" value="type" />
<s:textfield name="formList[%{#row.index}].unit" value="unit" />
</s:iterator>
当然,您的列表很容易受到客户端的更改,每个能够按F12的用户都可以修改您的列表,那么您应该小心。
例如,您可以在**会话中仅放置 ID **,在JSP中注入List,然后在接收数据时,匹配* ID *来自具有* ID * s的页面的List,用于检查发布的数据的完整性(没有新ID,没有双ID等)
答案 1 :(得分:2)
您的代码无效的原因是
<s:hidden name="propagateList" value="%{formList}"/>
不按照你的想法行事。
这会将名为propagateList
的HTML网页上的隐藏字段设置为formList.toString()
的值。这显然没用。
您需要设置为CSV或JSON或某些序列化,然后在客户端发回时将其反序列化。
似乎客户/服务器端混淆。
首先从数据库中获取formlist
并使用它来呈现您的页面。这是一个HTML页面,它被发送到客户端。
客户端使用您的formList
呈现HTML并执行操作,例如点击add
。
添加的结果是客户端将POST请求发送回带有数据的服务器。
您是否真的认为将1000个值重新发送回服务器并将其反序列化为List
而不是命中数据库更高效?一方面,这意味着应该非常小的POST请求变得相当大。
使用Session
或者在某种static
缓存中将其缓存在本地。