2014-09-05 65 views
1

我向同事解释了如何通过使用索引获取列表数据从JSP页面返回到操作类的方式,如herehere所解释的。他自己并不完全理解和摸索,直到他突然通过不使用索引完成工作!Struts2从JSP向Action类发送列表数据:替代方式

他在JSP页面中他有:

<input type="checkbox" name="contactNameList" value="someValue1"> 
<input type="checkbox" name="contactNameList" value="someValue2"> 
<input type="checkbox" name="contactNameList" value="someValue3"> 
<input type="checkbox" name="contactNameList" value="someValue4"> 

在他的动作类,他有 'appropiate' 制定者:

public List<String> getContactNameList() 

public void setContactNameList(List<String> list) 

我百思不得其解,为什么这项工作。我认为这有效,因为他发送非bean数据(在这种情况下字符串),并有一个智能构建到Struts2/OGNL追加值列表,而不是覆盖它们。

任何人都可以非常详细地解释这个“无指数”情况下背后隐藏的是什么?字符串列表是如何实例化的并使用上面的代码片段进行填充?

+1

那么为什么它不应该工作?如果你有一个列表,你总是可以调用'add'方法来向列表中添加一个元素,但是如果你需要改变/更新列表中的特定元素(在某个索引处)呢?你将如何引用该元素? – 2014-09-05 18:04:57

+0

在动作类中,结果是一个字符串列表。我们不需要专门引用任何字符串,只是遍历整个集合。无论如何,我很好奇java代码中发生了什么。何时以及如何调用add方法? struts2如何知道它不应该每次都用新的空白列表覆盖列表?当使用索引时,这很清楚,但没有我没有看到它。 – user1884155 2014-09-05 18:21:05

+0

你是什么意思?每次你打电话时都会重新创建**。有索引或没有它并不重要。 – 2014-09-05 18:24:37

回答

1

你应该明白,豆数据,而不是bean数据作为参数传递给动作传递的。如果您实施ParameterAware,则参数的结构可以找到。

注意,对于一个给定的名称的所有参数值将被退回,所以 对象的地图类型是java.lang.String[]

然后XWork类型转换尽最大努力将此映射转换为bean属性。见Built in Type Conversion Support

框架中的例程类型转换是透明的。通常, 您只需确保HTML输入的名称在OGNL表达式中可以使用 。 (HTML输入是表单元素和其他 GET/POST参数。)

在没有索引的情况下的参数的一个键下映射,而不是索引名称下自己的名称使用。

-1

你必须设置指标值在上面的代码中

<input type="checkbox" name="contactNameList[0]" value="someValue1"> 
+0

不,这就是这个问题的全部,你不必为它设置一个索引:),我觉得它很奇怪。 – user1884155 2014-09-06 08:50:14

+0

不,你不知道;当你不知道时,S2会注意到有多个值,迭代并添加到集合中。 – 2014-09-06 17:55:41