私のコントローラーでは:
@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属性に基づいてマッピングされることは私の理解でした。ここには明らかに何かが欠けています。
問題は私のセットアップに関連していないようです。問題は、フォームバッキング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>
最も簡単な解決策は、モデルクラスのtoString()メソッドをオーバーライドすることです。この場合は、以下のようにtoString()をオーバーライドして、クラスUserFormを変更します。
@Override
public String toString() {
return this.getCompanyName();
}
Springは、form:optionで正しい値を自動的に選択します
このように試すこともできます
<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>
同じ問題でしばらく苦労していました。これは私が持っていた選択フィールドです
<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エンティティに等号とハッシュコードを実装し、それが機能しました!
それほど複雑ではありません。 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」フィールドの値を使用して自動的に選択します。