web-dev-qa-db-ja.com

選択した値をSpring MVCフォームで設定するにはどうすればよいですか?

私のコントローラーでは:

@Controller
public class UserController {

    @RequestMapping(value="/admin/user/id/{id}/update", method=RequestMethod.GET)
    public ModelAndView updateUserHandler(@ModelAttribute("userForm") UserForm userForm, @PathVariable String id) {

        Map<String, Object> model = new HashMap<String, Object>();
        userForm.setCompanyName("The Selected Company");
        model.put("userForm", userForm);

        List<String> companyNames = new ArrayList<String>();
        companyNames.add("First Company Name");
        companyNames.add("The Selected Company");
        companyNames.add("Last Company Name");

        model.put("companyNames", companyNames);

        Map<String, Map<String, Object>> modelForView = new HashMap<String, Map<String, Object>>();
        modelForView.put("vars", model);

        return new ModelAndView("/admin/user/update", modelForView);
    }
}

私のビューの選択フォームフィールド:

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm">
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="id" itemLabel="companyName" />
</form:form>

フォームバッキングBeanがフォームのmodelAttribute属性に基づいてマッピングされることは私の理解でした。ここには明らかに何かが欠けています。

13
user4903

問題は私のセットアップに関連していないようです。問題は、フォームバッキングBeanの会社名プロパティとの比較が行われているときに、itemValueが会社IDプロパティに設定されていることでした。したがって、2つは等しくなかったため、選択するように設定された項目はありません。

上記のコードは問題なく機能し、特定のプロパティのuserFormに値を設定すると、アイテムコレクション内のいずれかのアイテムの値がフォームの値と同じである限り、その値が選択フォームフィールドで選択されたとおりに設定されます。フォームフィールドを次のように変更して、IDではなくcompanyNameを取得します。

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm">
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="companyName" itemLabel="companyName" />
</form:form>
11
user4903

最も簡単な解決策は、モデルクラスのtoString()メソッドをオーバーライドすることです。この場合は、以下のようにtoString()をオーバーライドして、クラスUserFormを変更します。

@Override
public String toString() {
    return this.getCompanyName();
}

Springは、form:optionで正しい値を自動的に選択します

8
Ayman Al-Absi

このように試すこともできます

<form:select id="selectCategoryId" path="categoryId"
      class="selectList adminInput admin-align-input" multiple="">
      <option value="0">-- Select --</option>
      <c:forEach items="${categories}" var="category">
            <option <c:if test="${category.key eq workflowDTO.categoryId}">selected="selected"</c:if>    value="${category.key}">${category.value} </option>
        </c:forEach>
</form:select>
6
NIrav Modi

同じ問題でしばらく苦労していました。これは私が持っていた選択フィールドです

<form:select path="Origin" items="${origins}" itemValue="idOrigin" itemLabel="name" />

私のエンティティ用にPropertyEditorを配置していたので、次のようなものを書くことができませんでした

<form:select path="Origin.idOrigin" items="${origins}" itemValue="idOrigin" itemLabel="name" />

これは正常に機能しましたが、PropertyEditorによって解析されませんでした。

したがって、エンティティ間の同等性を判断するためのSpringの必要性を考えると、idOriginプロパティのみを使用して、Originエンティティに等号とハッシュコードを実装し、それが機能しました!

6
Dario Zamuner

それほど複雑ではありません。 2つのBeanが必要です。フォームバッキングBeanとドメインモデルの選択モデルです。

これが私のモデル、文字列のリストです:

/* in controller: my select model is a list of strings. However, it can be more complicated, then you had to use PropertyEditors for String <-> Bean conversions */

    List<String> mySelectValues = new ArrayList<String>();
    mySelectValues.add("M");
    mySelectValues.add("F");
    modelMap.addAttribute("mySelectValues", mySelectValues);

これがあなたのフォームです、基本的に:

<form:form command="user">
  <form:select path="gender">
     <form:options items="${mySelectValues}"></form:options>                                                                                                       
  </form:select>    
</form:form>

ここに私のバッキングオブジェクトがあります:

public class User {
    private String gender;
    /* accessors */
}

Springフレームワークは、「gender」フィールドの値を使用して自動的に選択します。

3
Erhan Bagdemir