false时,复选框值不会绑定到对象中?

时间:2012-01-04 08:07:08

标签: java html spring spring-mvc freemarker

我使用 ModelAttribute 来绑定Spring Web应用程序中的对象。

一旦我注意到,如果对象的布尔值为A,则如果我们取消选中A的复选框,则不会更新其值。

例如,我有一个Lesson对象,其属性为“active”= true。 在“编辑课程”视图中,我创建一个绑定到“活动”的复选框。如果选中复选框(绑定对象反映更改),情况会很好,但如果我们取消选中复选框,则对象课程不会更改。

进一步的研究告诉我,这是因为浏览器可能无法提交复选框值(这是HTML的设计)。所以我必须使用丑陋的request.getParameter来检查值是否已设置。

我刚来this question,我看到asp.net mvc提供了一种更优雅地解决它的方法。我认为Spring必须提供类似的东西。有谁知道怎么做?

以下是我的代码:

控制器代码:

    @RequestMapping(value="/test", method = RequestMethod.POST)
    public String processEditLesson(@Valid Lesson lesson, BindingResult bindingResult, Model model) {
        System.out.println("Lesson is active: " + lesson.isActive()); // still "true" even if the checkbox is unset

        // Current work-around
        String isActive = request.getParameter("active");
        if (StringUtils.isNotNullOrEmpty(isActive)) {
            lesson.setActive(true);
        } else {
            lesson.setActive(false);
        }
        ...
    }

查看代码:

<form id="lesson" class="EditorForm" action="${rc.getContextUrl('/test.html')}" method="post" >

    <fieldset>
        <legend><@spring.message code="lesson.edit"/></legend>
        <@spring.formHiddenInput "lesson.id" />
        <@spring.formHiddenInput "lesson.studio.id" />

        <div class="Entry">
            <label for="name"><@spring.message code="lesson.message"/></label>
            <@spring.formInput "lesson.message" />
            <span class="ErrorMessage"><@spring.showErrors "<br/>" /></span>
        </div>

        <input type="checkbox" name="active" checked="checked" />
        <label for="active">${rc.getMessage('lesson.active')}</label>

        <input type="submit" value="<@spring.message code='common.update' />" />
    </fieldset>
</form>

3 个答案:

答案 0 :(得分:20)

Spring有一个内置的解决方法。

只需将以下隐藏字段添加到表单中:

<input type="hidden" value="on" name="_active"/>

带有前导下划线的参数是某种标记,用于指示是否存在具有相同名称但没有下划线的复选框参数。

如果仅提交lesson.active,则Spring现在应将_active=on设置为false。

答案 1 :(得分:2)

我认为你应该使用springframework标签 - 为什么你使用普通的HTML?如果您的视图是JSP页面,则只需导入:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

然后你可以使用:

<form:checkbox path="path" label="label" />

处理问题。

答案 2 :(得分:1)

你可以使用spring framework标签,它会自动将你选择的值设置为bean类,然后很容易在你的控制器类中获得它的值。

在路径上你需要把你的bean变量名称

并且要使用它,您需要为表单指定命令名称并使用该命令名将bean对象绑定到该jsp

model.addAttribute(“命令名称”,bean对象)在控制器中使用它来绑定对象。