0

複数のチェックボックス タグをレンダリングするために GET で初期化される Map フィールドにオブジェクトをバインドしようとしています。フォームが作成されるとすべてのチェックボックスが表示されますが、フォームが送信されると、MessageForm (モデル属性) オブジェクトの Map エントリはバインドされません (マップ サイズ = 0)。このマップ フィールドを追加する前は、他のフィールド (メッセージ) が適切に設定されていました。MessageForm.hierarchySelections フィールドを取得して、GET 要求で入力されたすべてのエントリを設定するにはどうすればよいですか?

unitNode.jsp (VIEW_MESSAGE_FORM):

<div class="nodeContainer">
    <div class="nodeHeader">
        <form:checkbox path="hierarchySelections['${node.code}']"/>
        <form:label path="hierarchySelections['${node.code}']">
            ${node.name}
        </form:label>
    </div>
    <div class="nodeChildren">
        <c:forEach var="node" items="${node.children}">
            <c:set var="node" value="${node}" scope="request"/>
            <jsp:include page="unitNode.jsp"/>
        </c:forEach>
    </div>
</div>

MessageForm.java:

public class MessageForm {
    private Message message;
    private Map<String, Boolean> hierarchySelections = new HashMap<String, Boolean>();    
    // getters and setters
}

MessageFormController.java (抜粋):

@RequestMapping(value = "/message/new")
public String newMessage(final Model model) {
    final MessageForm messageForm = new MessageForm();

    // get the root hierarchy node
    final Node rootNode = hierarchyService.getNodeHierarchy();
    messageForm.getHeirarchy(rootNode);

    final Stack<Node> nodeList = new Stack<Node>();
    nodeList.add(rootNode);

    final Map<String, Boolean> hierarchySelections = messageForm.getHierarchySelections();
    while (!nodeList.isEmpty()) {
        final Node node = nodeList.pop();

        // set the selection status to false/unchecked
        hierarchySelections.put(node.getCode(), Boolean.FALSE);

        // add all children organization units to the stack
        for (final Node nodeChild : node.getChildren()) {
            nodeList.add(nodeChild);
        }
    }   
    model.addAttribute("messageForm", messageForm);
    return VIEW_MESSAGE_FORM;
}

@RequestMapping(value = "/message/new", method = RequestMethod.POST)
public String createMessage(@Valid final MessageForm messageForm, final BindingResult bindingResult) {
    if (bindingResult.hasErrors()) { // TODO
    } else {
        messageCenterService.createMessage(messageForm.getMessage());
    }  
    return VIEW_MESSAGE_FORM;
}
4

1 に答える 1

1

チェックボックスのシリアル化は、期待どおりに機能しないと思います。

チェックされていないチェックボックス要素は送信されません。チェックされている場合、値属性からのテキストが送信されます。

ということで、まずは Firebug/Chrome デバッガー(ネットワークタブ)を使って、ブラウザからサーバーに送信される情報を監視します。

于 2013-06-20T14:15:20.417 に答える