3

我在我的 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 条记录,那么有没有办法在不使用 session 的情况下将这个列表从 jsp 传递到 Struts 2 中的另一个操作?

4

2 回答 2

5

要回答“如何在不使用会话的情况下将列表从 ActionA 传递到 ActionB”的问题:

  • 如果是List<String>

    <s:iterator value="formList" status="row">
        <s:hidden name="formList[%{#row.index}]" />
    </s:iterator>
    

这将遍历您的整个列表,并<s:hidden/>为列表的每个元素生成一个元素;这样,您可以将未更改的列表从一个动作传递到另一个动作。

  • 在 a 的情况下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>

当然你的 List 容易受到客户端更改的影响,每个能够按 F12 的用户都可以修改你的 List,那么你应该小心。

例如,您可以只将ID**s 放入 **session 中,将 List 注入 JSP,然后在接收回数据时,将来自页面的 List的 * ID *s 与 * ID *匹配s 你在 Session 中,用于检查发布的数据的完整性(没有新的 ID,没有双重 ID 等)

于 2013-05-13T08:46:03.907 回答
2

您的代码不起作用的原因是

<s:hidden name="propagateList" value="%{formList}"/>

不做你认为它做的事。

这会将 HTML 页面上的隐藏字段设置propagateList为 的值formList.toString()。这显然没有用。

您需要将其设置为 CSV 或 JSON 或一些序列化,然后在客户端发回时对其进行反序列化。

似乎存在客户端/服务器端混淆。

首先,您formlist从数据库中获取并使用它来呈现您的页面。这是一个 HTML 页面,它被发送到客户端。

客户端用您的方式呈现 HTML,然后执行某些操作,例如formList单击。add

添加的结果是客户端将 POST 请求连同数据一起发送回服务器。

您真的认为将 1000 个值以序列化的形式发送回服务器然后将它们反序列化回 aList而不是命中数据库更有效吗?一方面,这意味着应该非常小的 POST 请求变得相当大。

Session在某种缓存中使用或者可能在本地缓存它static

于 2013-05-12T10:17:41.820 回答