Struts1系列中关于<select>标签的选择项<option>标签的生成,提供了三种标签,分别是<html:option>,<html:options>和<html:optionsCollection>。其中<html:option>用于生成单个的<option>标签,而另外两个则是用于生成一组<option>标签。三个标签可以同时出现在<html:select>的body中。
本文主要是记录<html:options>和<html:optionsCollection>这两个标签的使用及区别。
术语知识
在我们下面的内容中,将会使用到label 和value 两个术语。下面是一个select的sample code,其中1和2表示一个option的value ,而Red和Blue则表示一个option的label ,是显示给用户看的东西。
<select name="selectName">
<option value="1">Red</option>
<option value="2">Blue</option>
</select>
<html:options>
支持的属性有:collection,filter,labelName,labelProperty,name,property,style,styleClass
其中filter,style,styleClass都是一些通用的属性,其他标签也都有类似的属性,功能相同,本文不再做解释。真正需要注意的是其他的五个标签。
collection表示任何scope中的一个collection对象的名字。根据collection是否被指定,该标签有两种使用方法。
collection被指定
如果collection被指定的话,那么应该同时指定property和labelProperty属性。其中property是collection对象中保存的对象中表示value的属性名,labelProperty则是表示label的属性名。如果labelProperty没有被指定的话,那么label将与value保持一致。
Struts框架已经为我们提供了一个可以用于完成此项工作的util类:LabelValueBean,它有一个构造函数LabelValueBean(String label, String value)。当然,我们也可以使用自己创建的类。
下面的代码就是我们使用这个LabelValueBean和<html:options>标签的一段sample code。
<%
List colorList = new ArrayList();
colorList.add(new LabelValueBean("Red", "1");
colorList.add(new LabelValueBean("Blue", "2");
%>
<html:select property="testProperty">
<html:options collection="colorList" property="value" labelProperty="label"/>
</html:select>
collection未被指定
如果collection没有被指定的话,那么就要靠剩下的四个属性了。(name,property,labelName,labelProperty)
其中name和property指向一个包含了<select>的value的collection对象。
如果只指定了name的话,表示任意scope中的一个collection对象的名字;
如果只指定了perperty的话,表示是ActionForm bean上的一个属性的名字,它是一个collection对象;
如果两者同时指定的话,name表示是任意scope中的一个对象,而property则是指这个对象上的一个属性的名字,该属性是一个collection对象。
而labelName和labelProperty是指向一个包含了<select>的label的collection对象。
如果两者都不指定的话,则label和name和property所表示的value一致。
其余三种情况和name和property的组合是类似的。
下面的代码分别对value和label使用了不同的组合。
public ColorBean {
.........
private String[] colorValue;
public String[] getColorValue() {
return this.colorValue;
}
public void setColorValue(String[] value) {
this.colorValue = value;
}
........
}
<%
String[] colorLabel = {"Red", "Blue"};
String[] tempColorValue = {"1", "2"};
ColorBean colorBean = new ColorBean();
colorBean.setColorValue(tempColorValue);
%>
<html:select property="testProperty">
<html:options name="colorBean" property="colorValue" labelProperty="colorLabel"/>
</html:select>
一个小建议:
不要使用Map类型的对象,因为我们在做应用程序的时候,<select>中的值一般都是用顺序的,而Map类型则是无序的。
<html:optionsCollection>
支持的属性有:filter,label,name,property,style,styleClass,value
其中filter,style,styleClass都是一些通用的属性。
<html:optionsCollection>只有一种使用方式。其中name和property指定了一个collection类型的对象,而这个collection对象包含的bean对象同时包括了<select>的value和label。另外两个label和value属性则分别指代这个bean对象的label和value的属性名。
其实,这个tag和类LabelValueBean算是珠联璧合,因为这个tag的label和value两个属性的默认值分别就是“label"和"value"。也就是说,如果使用的是LabelValueBean的话,我们甚至不需要指定label和value这两个属性,只需要指定name和property的组合就可以了。
闲话不多说,sample code奉上。
<%
List colorList = new ArrayList();
colorList.add(new LabelValueBean("Red", "1");
colorList.add(new LabelValueBean("Blue", "2");
%>
<html:select property="testProperty">
<html:optionsCollection name="colorList"/>
</html:select>
总结
1. <html:options>和<html:optionsCollection>都可以使用包含了类似于LabelValueBean的bean类的collection对象。但是,<html:options>只能使用存在于任意scope的collection对象,而<html:optionsCollection>不但可以使用存在于任意scope的collection对象,而且可以使用form上的collection对象,或者是存在于任意scope中的对象上的collection对象。
2. <html:options>是可以分别指定label和value的,一般指定到包含内容为String类型的collection对象。
参考
<html:options>: http://struts.apache.org/1.x/struts-taglib/tagreference.html#html:options
<html:optionsCollection>: http://struts.apache.org/1.x/struts-taglib/tagreference.html#html:optionsCollection