很难想象现代Web应用程序中没有表单复选框的情况。 在之前的一篇文章中,我写了有关Spring MVC中的表单处理的文章 ,作为本系列文章的续篇,我将写有关Spring MVC表单的文章,尤其是关于复选框处理的文章 。 这篇文章将介绍标签的标准用法。 在以下情况下,我将检查复选框标记用法的三种情况:
- Chekbox是布尔值
- Chekbox是一个字符串值
- 复选框组代表字符串数组
因此,您可以看到这三点很简单,但是需要开发人员方面的注意。 下面,我将描述如何实现这些情况,您可以在文章末尾下载源代码。
复选框:布尔值
对于第一种情况,我将使用以下域模型:
public class Hobby {private boolean hobbyExists;public boolean isHobbyExists() {return hobbyExists;}public void setHobbyExists(boolean hobbyExists) {this.hobbyExists = hobbyExists;}}
此类不需要任何解释,因为它是带有getter和setter的简单bean。 现在,我可以向您展示这种情况的视图:
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
...
<h1>Hobby page</h1>
<form:form method="POST" commandname="hobby" action="hobby-result.html">
<table><tbody><tr><td>Is any hobby: </td><td><form:checkbox path="hobbyExists"></form:checkbox></td></tr><tr><td colspan="2"><input value="Submit" type="submit"></td></tr>
</tbody></table>
</form:form>
...
注意,使用Spring表单标签意味着导入了适当的标签库。 复选框标签包含与域模型的属性相对应的属性路径 。 结果将显示在另一页上:
...
<h1>Hobby result page</h1>
Is any hobby? - ${hobby.hobbyExists} <br />
...
最后,我需要为所有这些东西声明一个控制器:
@Controller
public class HobbyController {@RequestMapping(value="/hobby-page")public ModelAndView hobbyFormPage() {return new ModelAndView("hobby-form", "hobby", new Hobby());}@RequestMapping(value="/hobby-result")public ModelAndView processHobby(@ModelAttribute Hobby hobby) {ModelAndView modelAndView = new ModelAndView("hobby-result");modelAndView.addObject("hobby", hobby);return modelAndView;}}
复选框:字符串
第二种情况将通过以下域模型进行解释:
public class JobOffer {private String parking;public String getParking() {return parking;}public void setParking(String parking) {this.parking = parking;}}
这种情况的观点与前一种观点略有不同:
...
<h1>Job Offer page</h1><form:form method="POST" commandname="job" action="job-result.html"><table><tbody><tr><td>Job with parking? - </td><td><form:checkbox path="parking" value="parking" /></td></tr><tr><td colspan="2"><input type="submit" value="Submit" /></td></tr></tbody></table> </form:form>
...
注意,新属性出现在复选框标签中。 value属性表示域模型中的字符串属性。
结果将显示在另一页上:
...<h1>Job result page</h1><c:choose><c:when test="${job.parking != null}">You want job with ${job.parking}</c:when><c:otherwise>You want job without parking</c:otherwise></c:choose>
...
这个例子的控制器:
@Controller
public class JobController {@RequestMapping(value="/job-page")public ModelAndView jobOfferPage() { return new ModelAndView("job-form", "job", new JobOffer());}@RequestMapping(value="/job-result")public ModelAndView processJob(@ModelAttribute JobOffer jobOffer) {ModelAndView modelAndView = new ModelAndView("job-result");modelAndView.addObject("job", jobOffer);return modelAndView;}
}
复选框:字符串数组
本教程的最后一种情况将描述如何将字符串数组绑定到域模型中的属性。 以相同的方式,您可以绑定java.util.Collection的值。 因此,域模型将如下所示:
public class Food {private String[] favoriteFruit;public String[] getFavoriteFruit() {return favoriteFruit;}public void setFavoriteFruit(String[] favoriteFruit) {this.favoriteFruit = favoriteFruit;}
}
具有以下形式的页面:
...
<h1>Fruit page</h1><form:form method="POST" commandname="food" action="food-result.html"><table><tbody><tr><td>Apple </td><td><form:checkbox path="favoriteFruit" value="apple" /></td></tr><tr><td>Orange </td><td><form:checkbox path="favoriteFruit" value="orange" /></td></tr><tr><td>Banana </td><td><form:checkbox path="favoriteFruit" value="banana" /></td></tr><tr><td colspan="2"><input type="submit" value="Submit" /></td></tr></tbody></table> </form:form>
...
在处理过程中,复选框标记中的值将传递到字符串数组。
结果页面:
...
<h1>Food result page</h1>
You prefer:
<br /><c:foreach var="fruit" items="${food.favoriteFruit}">${fruit}<br /></c:foreach>
...
最后一种情况的控制器:
@Controller
public class FoodController {@RequestMapping(value="/food-page")public ModelAndView foodPage() { return new ModelAndView("food-form", "food", new Food());}@RequestMapping(value="/food-result")public ModelAndView processFuits(@ModelAttribute Food food) {ModelAndView modelAndView = new ModelAndView("food-result");modelAndView.addObject("food", food);return modelAndView;}}
复选框标签功能
呈现带有表单的页面时,您可以打开其源代码,并看到类似以下内容的内容:
...
<input id="favoriteFruit1" name="favoriteFruit" type="checkbox" value="apple" />
<input type="hidden" name="_favoriteFruit" value="on" />
...
奇怪,附加输入从哪里出现? 官方文档解释了这一事实:
如果未选中HTML页面中的复选框,则在提交表单后,其值将不会作为HTTP请求参数的一部分发送到服务器,因此我们需要针对HTML中的这个问题的变通办法,以便进行Spring表单数据绑定上班。 checkbox标记遵循现有的Spring约定,其中为每个复选框包括一个带有下划线(_)前缀的隐藏参数。 通过这样做,您可以有效地告诉Spring:“该复选框在表单中可见,并且我希望与表单数据绑定到的我的对象无论如何都将反映该复选框的状态”。
摘要
本文为您提供了有关复选框标记用法的高级概述,但这只是基础。 在最近的文章中,我将向您展示Spring MVC中复选框使用的更多有趣情况。 您可以单击链接下载整个应用程序的源代码。
翻译自: https://www.javacodegeeks.com/2013/05/spring-mvc-form-handling-vol-2-checkbox-processing.html