是否可以在struts2中的隐藏标记中为名称调用setter?

时间:2012-09-03 03:22:49

标签: struts2 hidden assign

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

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

我已在Action类中为数据和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有一个公共setter setSize(int size)。对于其他字段“testName”,它提交得很好..所以我的语法有问题吗?

非常感谢你。

1 个答案:

答案 0 :(得分: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(),然后再修改矢量大小。我不认为向外界揭露是一件非常好的事情,如果有人多次称你的行动传递了大量的话呢?