Multibox标签的用法:
<logic:iterate id="hobby" name="tagInfo" property="hobbies">
<html:multibox property="selectedHobbies">
<bean:write name="hobby"/> 这里是设置checkbox的value属性
</html:multibox>
<bean:write name="hobby"/> 这里是打印checkbox的文本显示
</logic:iterate>
就是两个数组的嵌套使用。Hobbies数组表示所有可供选择的兴趣爱好,selectedHobbies表示用户已有的兴趣爱好。在 iterate的遍历所有可供选择的外层hobbies循环中,内层selectedHobbies将针对hobbies中的每一个值,遍历自己所有元素,如果它们的value相匹配,就使这个checkbox的状态成为”checked”。
Renders an HTML <input> element of type checkbox
, whose "checked" status is initialized based on whether the specified value matches one of the elements of the underlying property's array of current values.
Id 代表外层hobbies每一个对象,iterate的name表示hobbies是指定scope中的一个对象,通过在Action类中request.setAttribute("tagInfo",aTag); 添加。Iterate的property表示name对象的属性。
Multibox的property就是ActionForm中与该jsp控件所绑定的instance variable。
那么现在的情况是checkbox的value属性(就是如果被选中将被提交的值) 和 checkbox的文本显示是一样的。即最终生成的html页面代码如下:
<input type="checkbox" name="selectedHobbies" value="music" checked="checked"> music
那么怎样使两者区分开,比如说value只是个数字,text则表示代表的意义?这个数据库的设计有关,user表,hobby表还有一个user_hobby表。一个user可以有多个hobby,hobby表只存储hobby信息,user_hobby有user到hobby的映射关系(user_id,hobby_id)。
我们改变外层数组元素的类型,设它为一个Hobby类,有id和name,而内层数组元素由于在数据库中的映射只是一个hobby_id,所以可以改变成int类型。于是可以改成
<logic:iterate id="hobby1" name="tagInfo" property="objHobbies">
<html:multibox property="intSelectHobbies">
<bean:write name="hobby1" property="id"/>
</html:multibox>
<bean:write name="hobby1" property="name"/>
</logic:iterate>
而生成的html代码:
<input type="checkbox" name="intSelectHobbies" value="1" checked="checked">音乐
也做到了真实值和显示值得分离。真实值被传递进Action类进行数据操作,显示值只是作为一个显示而已。