【问题标题】:Is it possible to call a setter for name in hidden tag in struts2?是否可以在struts2的隐藏标签中调用名称的setter?
【发布时间】:2012-09-03 03:22:48
【问题描述】:

在我的 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”,它已经很好地提交了。所以我的语法有问题吗?

非常感谢。

【问题讨论】:

  • 这将不起作用,因为您的隐藏字段将等同于 gettestVector().setSize(); 而不是这种情况,因为 testVector 是字符串列表,而且您的 testVector 是字符串类型,所以我我不确定你有 getter ans setter setSize(int size) 是什么意思?我可能读错了问题,你能用 getter 和 setter 显示你的动作类代码吗
  • testVector 是 Vector 类型的集合,因此它有一个已经预定义的公共方法 setSize。所以我认为当我写 name="testVector.size" 时会自动调用 getTestVector().setSize()。但是 testVector 的大小没有改变。我不是这个意思。谢谢。

标签: struts2 hidden assign


【解决方案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(),然后再修改矢量大小。这个我觉得暴露给外界不是什么好事,万一有人调用你的action很多次传入一个巨大的数字怎么办?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多