这个标签生成checkbox类型的HTML input标签。
假设模型中的User
支持每个用户设置自己的喜好,比如新闻订阅或者一组业余爱好,等等。下面是Preferences
这个类的定义:
public class Preferences { private boolean receiveNewsletter; private String[] interests; private String favouriteWord; public boolean isReceiveNewsletter() { return receiveNewsletter; } public void setReceiveNewsletter(boolean receiveNewsletter) { this.receiveNewsletter = receiveNewsletter; } public String[] getInterests() { return interests; } public void setInterests(String[] interests) { this.interests = interests; } public String getFavouriteWord() { return favouriteWord; } public void setFavouriteWord(String favouriteWord) { this.favouriteWord = favouriteWord; } }
现在,form.jsp
可以这么写:
<form:form> <table> <tr> <td>Subscribe to newsletter?:</td> <%-- Approach 1: Property is of typejava.lang.Boolean
--%> <td><form:checkbox path="preferences.receiveNewsletter"/></td> <td></td> </tr> <tr> <td>Interests:</td> <td> <%-- Approach 2: Property is of an array or of typejava.util.Collection
--%> Quidditch: <form:checkbox path="preferences.interests" value="Quidditch"/> Herbology: <form:checkbox path="preferences.interests" value="Herbology"/> Defence Against the Dark Arts: <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/> </td> <td></td> </tr> <tr> <td>Favourite Word:</td> <td> <%-- Approach 3: Property is of typejava.lang.Object
--%> Magic: <form:checkbox path="preferences.favouriteWord" value="Magic"/> </td> <td></td> </tr> </table> </form:form>
checkbox
有三种使用方法,应该可以满足我们全部可能的需求。
-
第一种用法:若绑定值是java.lang.Boolean类型,则值为
true
时,input(checkbox)
标为checked(选中)。其value
(值)属性对应于setValue(Object)
值属性的解析值。 -
第二种用法:若绑定值是array(数组)类型或
java.util.Collection
,则配置的setValue(Object)
值出现在绑定的Collection中时,input(checkbox)
标为checked(选中)。 -
第三种用法:若绑定值为其他类型,则当配置的
setValue(Object)
等于其绑定值时,input(checkbox)
标为checked(选中)。
不管使用那一种方法,生成的HTML代码都是一样的。下文是带有checkbox的部分HTML片段:
<tr> <td>Interests:</td> <td> Quidditch: <input name="preferences.interests" type="checkbox" value="Quidditch"/> <input type="hidden" value="1" name="_preferences.interests"/> Herbology: <input name="preferences.interests" type="checkbox" value="Herbology"/> <input type="hidden" value="1" name="_preferences.interests"/> Defence Against the Dark Arts: <input name="preferences.interests" type="checkbox" value="Defence Against the Dark Arts"/> <input type="hidden" value="1" name="_preferences.interests"/> </td> <td></td> </tr>
也许你注意到了每个checkbox元素后面都跟着一个隐藏区域(hidden field)。当一个HTML页面中的checkbox没有被选中时,这个checkbox的值不会在表单提交时作为HTTP请求参数发送到服务器端。这给Spring的表单数据绑定造成了麻烦。解决方法就是在每个checkbox后面加一个隐藏区域,并且每个隐藏区域的名字是在其对应的checkbox名字前加下划线("_")。这是Spring已有的惯例。这样一来,你相当于告诉Spring“这个表单中存在这样一个checkbox,我希望表单支持对象中相对应的属性和这个checkbox的状态保持一致 ”。