list、listKey和listValue属性对radio、combobox、select、checklist、doubleselect等标签来说非常重要。
我们可以用一组radio标签来提供一组选项。例如,下面这些HTML输入标签将呈现为如图5-5所示的一组单选按钮。
正如你看到的那样,这组单选按钮由一组值(1、2、3)和一组行标(Atlanta、Chicago、Detroit)构成,它们之间的键/值对应情况如下所示:
select元素也可以用来提供一组选项。下面的select元素(如图5-6所示)能够提供与刚才那组单选按钮一样的选项。
注意 在select元素里,value属性是可选的。如果没有给出这个属性,在某个选项被选中时,该选项的行标将作为select元素的值被发送到服务器。从理论上讲,radio元素的value属性也是可选的。可是,如果不给出value属性,单选按钮被选中时的值将是“on”而不是相应的radio元素的 label属性值,这无疑会让同一个表单里的多个radio元素难以区别。因此,在使用radio元素的时候往往必须给出它们的value属性。
本节解释了list、listKey和listValue属性在radio、select 和其他用来提供一组选项的标签里的使用方法。在使用这些标签时,你们需要提供一些键/值对作为那些选项的来源。在这3个属性当中,list属性是必不可少的,另外两个属性是可选的。我们可以把一个String、一个数组、一个java.util.Enumeration、一个 java.util.Iterator、一个java.util.Map或一个Collection赋值给list属性,这个值对象既可以放在一个动作对象里,也可以放在当前会话对象或当前ServletContext对象里。
注意 如果你动态赋给list属性的对象没有任何选项,你必须返回一个空的数组/Collection/Map,而不是返回一个空值(null)。
5.11.1 赋值一个String
你可以将一个数组赋值为String表示形式。例如,下面把一个字符串赋值给select标签:
这个select标签将呈现为:
请注意,每个选项的值和行标使用的是同一个字符串元素。
在绝大多数Struts应用程序里,选项的值和行标应该不同,这需要使用如下所示的语法:
例如,下面这个select标签
将呈现为:
5.11.2 赋值一个Map
如果你想让各个选项的值与它的行标不同,你可以使用一个Map作为选项的来源。使用Map作为选项的来源很简单:把选项的值用作Map的键、把选项的行标用作Map的键值即可。例如,以下代码将创建一个名为cities的Map,它包含3个城市的名字:
如果cities是一个动作属性,你可以像下面这样把它赋值给list属性:
或者,如果cities是一个应用程序属性,你可以使用如下所示的代码:
5.11.3 赋值一个Collection或一个对象数组
你还可以使用一个对象数组或一个对象Collection来作为选项的来源。此时,你将需要用到list、listKey和listValue属性。具体做法是:把那个数组或Collection赋值给list属性,把用来提供选项值的对象属性赋值给listKey属性,把用来提供选项行标的对象属性赋值给listValue属性。
例如,假设某个动作对象的getCities方法将返回一个以City对象为元素的List,而City对象有一个id和一个name属性,你就可以用如下所示的代码把这个List赋值给一个select标签: