1. 程式人生 > >Spring MVC標籤checkboxes,radiobuttons和selects的兩種匹配模式

Spring MVC標籤checkboxes,radiobuttons和selects的兩種匹配模式

Spring MVC中的checkboxes,radiobuttons和selects可以方便的把List,Set和Map物件的field對映到html文件中的選項標籤中,同時可以提供default選項。但是有一個細節需要注意,以checkboxes為例,下面的程式碼是可以正確執行的:

<form:form modelAttribute="user" method="post" action="selectForm" >
	<table>
		<tr>
			<td>興趣:</td>
			<td>
				<form:checkboxes path="hobbies" items="${hobbyList}" 
					itemLabel="name" itemValue="id"/>
			</td>
		</tr>
	</table>
</form:form>
	 @GetMapping(value="/selectForm4")
	 public String selectForm4(Model model) {
		 User user = new User();
		 List<Hobby> l = new ArrayList<>();
		 Hobby animation = new Hobby(1, "動漫");
		 Hobby computerGame = new Hobby(2, "遊戲");
		 Hobby sports = new Hobby(3, "運動");
		 Hobby singing = new Hobby(4, "唱歌");
		 l.add(animation);
		 l.add(computerGame);
		 user.setHobbies(l);
		 
		 List<Hobby> hobbyList = new ArrayList<>();
		 hobbyList.add(animation);
		 hobbyList.add(computerGame);
		 hobbyList.add(sports);
		 hobbyList.add(singing);
		 model.addAttribute("user", user);
		 model.addAttribute("hobbyList", hobbyList);
	     return "selectForm";
	 }

但下面這個不可以:

	 @GetMapping(value="/selectForm4")
	 public String selectForm4(Model model) {
		 User user = new User();
		 List<Hobby> l = new ArrayList<>();
		 l.add(new Hobby(1, "動漫"));
		 l.add(new Hobby(2, "遊戲"));
		 user.setHobbies(l);
		 
		 List<Hobby> hobbyList = new ArrayList<>();
		 hobbyList.add(new Hobby(1, "動漫"));
		 hobbyList.add(new Hobby(2, "遊戲"));
		 hobbyList.add(new Hobby(3, "運動"));
		 hobbyList.add(new Hobby(4, "唱歌"));
		 model.addAttribute("user", user);
		 model.addAttribute("hobbyList", hobbyList);
	     return "selectForm";
	 }

區別在於,後面這個程式碼為CheckBox準備的選項列表hobbyList中的物件和default選項user.hobbies中的物件雖然“值”可以對應上,但其實不是同一個物件。可見在最終解析的時候是比較引用而不是比較值的。 另外一個方法可以只攝者default選項的value:

<form:form modelAttribute="user" method="post" action="selectForm" >
	<table>
		<tr>
			<td>興趣:</td>
			<td>
				<form:checkboxes path="hobbyIds" items="${hobbyList}" 
					itemLabel="name" itemValue="id"/>
			</td>
		</tr>
	</table>
</form:form>
	 @GetMapping(value="/selectForm4")
	 public String selectForm4(Model model) {
		 User user = new User();
		 List<Integer> l = new ArrayList<>();
		 l.add(1);
		 l.add(2);
		 user.setHobbyIds(l);
		 
		 List<Hobby> hobbyList = new ArrayList<>();
		 hobbyList.add(new Hobby(1, "動漫"));
		 hobbyList.add(new Hobby(2, "遊戲"));
		 hobbyList.add(new Hobby(3, "運動"));
		 hobbyList.add(new Hobby(4, "唱歌"));
		 model.addAttribute("user", user);
		 model.addAttribute("hobbyList", hobbyList);
	     return "selectForm";
	 }

綜上,checkboxes,radiobuttons和selects等Spring MVC中備選項和default選項之間的匹配存在兩種匹配模式:按物件引用匹配和按value匹配。