1

在我的 jsp 页面中,我有一个表单(在 struts2 中),在该表单中,我尝试在提交表单后使用隐藏标记将 ArrayList 数据的大小分配给 Vector testVector,但我仍然得到 testVector 的大小等于 0。

<s:hidden name="testVector.size" value="%{data.size}" />

我在 Action 类中为 data 和 testVector 创建了 setter 和 getter。

private Vector<String> testVector = new Vector<String>();
private ArrayList<String> data = new ArrayList<String>();
private String testName; // a field for testing the form. 

// getters and setters of testVector and data

我认为这应该可以工作,因为 Vector 有一个公共设置器 setSize(int size)。对于另一个字段“testName”,它已经很好地提交了。所以我的语法有问题吗?

十分感谢。

4

1 回答 1

1

您不应该使用 Vector。请注意,出于安全原因,OGNL 在请求中的工作方式与在呈现 JSP 时的工作方式不同,它太强大了。您应该只从请求中设置 bean 属性、集合、数组和内置类型(忽略类型转换器)。

从这种情况下的请求来看,它认为正在尝试将值放入向量中。我认为它会创建一个新字符串并将其放入 Vector 中,然后尝试设置字符串的大小(这将不起作用,因为该方法不存在)。

为了确认这一点,我尝试按照您所说的进行操作,并且日志指出:

WARNING: Error setting expression 'testVector.size' with value '[Ljava.lang.String;@5c7b2d2f'
ognl.OgnlException: Error converting given String values for Collection. [ognl.NoSuchPropertyException: java.lang.String.size] 

如果您想要这种行为,您将需要在您的操作中创建第二个方法,例如 setSize(),然后再修改矢量大小。这个我觉得暴露给外界不是很好的事情,万一有人叫你的动作很多次传入一个巨大的数字怎么办?

于 2012-09-03T06:40:48.310 回答