使用s:select元素

时间:2014-02-18 18:36:14

标签: java struts2 ognl

我正在尝试使用s:select元素来设置操作上对象属性的值。该属性未初始化(null)并具有getter和setter。该属性的类也有适当的getter和setter:

public class MyProperty {
    private String myField;
    public String getMyField() { return myField; }
    public void setMyField(String myField) { this.myField = myField; }
}

使用s:textfield元素完成此操作没有任何困难,输入表单生成并接受/返回值:<s:textfield name="myProperty.myField" />

当我尝试使用s:select元素执行相同操作时,生成输入表单时会发生错误。

元素是:<s:select name="myProperty.myField" [... list/listKey/listValue...] />

错误是:"ognl.OgnlException: source is null for getProperty(null, "myField")"

我发现错误可以通过初始化动作(myProperty = new MyProperty();)中的属性来解决,但这两者看起来都很尴尬(必须根据将要使用的界面元素做一些特殊的事情),以及在实际用例中不起作用。这个解决方案看起来很奇怪,因为我的理解是OGNL很乐意在引用时实例化对象(例如当我使用s:textfield时),只要它们不存在就已经存在。

实际用例是一个输入表单,其中包含一对选择元素的列表(要排序的列和排序方向)。目的是JSP页面能够允许一些任意数量的这些对,并且该动作应该适用于它接收的任何大小的列表。因为在生成输入表单JSP之前,操作不知道列表的大小,所以不可能事先初始化正确数量的元素。

问题:使用as:select元素的对象属性的最佳方法是什么,这样解决方案也可以使用属性作为列表大小的对象列表事先不知道?

我的Struts 2的特定版本是2.3.1.2,如果这是相关的。


如果它影响到问题的答案,或者我的问题不清楚,我想要最终得到的是:

<s:select name="sort[0].criterion" [...] />
<s:select name="sort[0].order" [...] />
<s:select name="sort[1].criterion" [...] />
<s:select name="sort[1].order" [...] />
[maybe some more pairs...]

...

private List<SortOrderPair> sort = new ArrayList<SortOrderPair>();
public SortOrderPair getSort() { return sort; }
public void setSort(SortOrderPair sort) { this.sort = sort; }

0 个答案:

没有答案
相关问题