Struts1:options和optionsCollection的使用及区别

Struts1系列中关于<select>标签的选择项<option>标签的生成,提供了三种标签,分别是<html:option>,<html:options>和<html:optionsCollection>。其中<html:option>用于生成单个的<option>标签,而另外两个则是用于生成一组<option>标签。三个标签可以同时出现在<html:select>的body中。

本文主要是记录<html:options>和<html:optionsCollection>这两个标签的使用及区别。

 

 

术语知识

在我们下面的内容中,将会使用到labelvalue 两个术语。下面是一个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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值