Spring WebアプリケーションでオブジェクトをバインドするためにModelAttributeを使用しました。
オブジェクトのブール値Aがtrueの場合、Aのチェックボックスをオフにしても、その値は更新されません。
たとえば、属性「active」= trueを持つLessonオブジェクトがあります。 「レッスンの編集」ビューで、「アクティブ」にバインドするチェックボックスを作成します。チェックボックスをオンにすると(バインディングオブジェクトに変更が反映されます)、問題なく動作しますが、チェックボックスをオフにしてもオブジェクトレッスンは変更されません。
さらなる調査によると、チェックボックスの値がブラウザによって送信されない可能性があるためです(これはHTMLの設計内です)。したがって、醜いrequest.getParameter
を使用して、値が設定されているかどうかを確認する必要があります。
私はちょうど この質問 で来ます、そして私はasp.netmvcがそれをよりエレガントに回避する方法を提供するのを見ます。 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>
Springには回避策が組み込まれています。
この追加の非表示フィールドをフォームに追加するだけです。
<input type="hidden" value="on" name="_active"/>
アンダースコアが先頭にあるパラメーターは、ある種のマーカーであり、同じ名前のチェックボックスパラメーターが存在することを示しますが、アンダースコアはありません。
lesson.active
のみが送信された場合、Springは_active=on
をfalseに設定する必要があります。
Springframeworkタグを使用する必要があると思います-なぜプレーンHTMLを使用しているのですか?ビューがJSPページの場合は、以下をインポートするだけです。
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
そして、あなたは使用することができます:
<form:checkbox path="path" label="label" />
問題を処理します。
選択した値をBeanクラスに自動的に設定し、コントローラークラスでその値を取得するのが非常に簡単になるように、SpringFrameworkタグを使用できます。
パス上にBean変数名を入力する必要があります
これを使用するには、フォームにコマンド名を付け、そのコマンド名を使用してBeanオブジェクトをそのjspにバインドする必要があります。
model.addAttribute( "command name"、bean object)は、コントローラーでこれを使用してオブジェクトをバインドします。