剛開始用spring mvc 做web開發時,經常會不知道如何合適綁定頁面數據.用慣struts2的朋友更認為spring mvc 綁定數據不如struts2方便(本人最開始也是這么認為),經過一段時間的應用和測試,總結出以下幾種情況,希望對剛接觸spring mvc 的朋友有所幫助.
查看spring源碼可以看出spring支持轉換的數據類型已經很多了.
org.springframework.beans.PropertyEditorRegistrySupport.java
- /**
- * Actually register the default editors for this registry instance.
- */
- private void doRegisterDefaultEditors() {
- this.defaultEditors = new HashMap<Class, PropertyEditor>(64);
- // Simple editors, without parameterization capabilities.
- // The JDK does not contain a default editor for any of these target types.
- this.defaultEditors.put(Charset.class, new CharsetEditor());
- this.defaultEditors.put(Class.class, new ClassEditor());
- this.defaultEditors.put(Class[].class, new ClassArrayEditor());
- this.defaultEditors.put(Currency.class, new CurrencyEditor());
- this.defaultEditors.put(File.class, new FileEditor());
- this.defaultEditors.put(InputStream.class, new InputStreamEditor());
- this.defaultEditors.put(Locale.class, new LocaleEditor());
- this.defaultEditors.put(Pattern.class, new PatternEditor());
- this.defaultEditors.put(Properties.class, new PropertiesEditor());
- this.defaultEditors.put(Resource[].class, new ResourceArrayPropertyEditor());
- this.defaultEditors.put(TimeZone.class, new TimeZoneEditor());
- this.defaultEditors.put(URI.class, new URIEditor());
- this.defaultEditors.put(URL.class, new URLEditor());
- // Default instances of collection editors.
- // Can be overridden by registering custom instances of those as custom editors.
- this.defaultEditors.put(Collection.class, new CustomCollectionEditor(Collection.class));
- this.defaultEditors.put(Set.class, new CustomCollectionEditor(Set.class));
- this.defaultEditors.put(SortedSet.class, new CustomCollectionEditor(SortedSet.class));
- this.defaultEditors.put(List.class, new CustomCollectionEditor(List.class));
- this.defaultEditors.put(SortedMap.class, new CustomMapEditor(SortedMap.class));
- // Default editors for primitive arrays.
- this.defaultEditors.put(byte[].class, new ByteArrayPropertyEditor());
- this.defaultEditors.put(char[].class, new CharArrayPropertyEditor());
- // The JDK does not contain a default editor for char!
- this.defaultEditors.put(char.class, new CharacterEditor(false));
- this.defaultEditors.put(Character.class, new CharacterEditor(true));
- // Spring's CustomBooleanEditor accepts more flag values than the JDK's default editor.
- this.defaultEditors.put(boolean.class, new CustomBooleanEditor(false));
- this.defaultEditors.put(Boolean.class, new CustomBooleanEditor(true));
- // The JDK does not contain default editors for number wrapper types!
- // Override JDK primitive number editors with our own CustomNumberEditor.
- this.defaultEditors.put(byte.class, new CustomNumberEditor(Byte.class, false));
- this.defaultEditors.put(Byte.class, new CustomNumberEditor(Byte.class, true));
- this.defaultEditors.put(short.class, new CustomNumberEditor(Short.class, false));
- this.defaultEditors.put(Short.class, new CustomNumberEditor(Short.class, true));
- this.defaultEditors.put(int.class, new CustomNumberEditor(Integer.class, false));
- this.defaultEditors.put(Integer.class, new CustomNumberEditor(Integer.class, true));
- this.defaultEditors.put(long.class, new CustomNumberEditor(Long.class, false));
- this.defaultEditors.put(Long.class, new CustomNumberEditor(Long.class, true));
- this.defaultEditors.put(float.class, new CustomNumberEditor(Float.class, false));
- this.defaultEditors.put(Float.class, new CustomNumberEditor(Float.class, true));
- this.defaultEditors.put(double.class, new CustomNumberEditor(Double.class, false));
- this.defaultEditors.put(Double.class, new CustomNumberEditor(Double.class, true));
- this.defaultEditors.put(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, true));
- this.defaultEditors.put(BigInteger.class, new CustomNumberEditor(BigInteger.class, true));
- // Only register config value editors if explicitly requested.
- if (this.configValueEditorsActive) {
- StringArrayPropertyEditor sae = new StringArrayPropertyEditor();
- this.defaultEditors.put(String[].class, sae);
- this.defaultEditors.put(short[].class, sae);
- this.defaultEditors.put(int[].class, sae);
- this.defaultEditors.put(long[].class, sae);
- }
- }
1.基本數據類型
很簡單,該怎么寫就怎么寫.
controller代碼
- @RequestMapping
- public void test1(String name, Integer age, Double income, Boolean isMarried, String[] interests)
- {
- System.out.println("簡單數據類型綁定=========");
- System.out.println("名字:" + name);
- System.out.println("年齡:" + age);
- System.out.println("收入:" + income);
- System.out.println("已結婚:" + isMarried);
- System.out.println("興趣:");
- for (String interest : interests)
- {
- System.out.println(interest);
- }
- System.out.println("====================");
- }
jsp代碼
- <form action="test1.do" method="post">
- <div class="f_left">姓名:</div>
- <div class="f_left"><input name="name" value="張三"/></div>
- <div class="clear"></div>
- <div class="f_left">年齡:</div>
- <div class="f_left"><input name="age" value="20"/></div>
- <div class="clear"></div>
- <div class="f_left">收入:</div>
- <div class="f_left"><input name="income" value="100000"/></div>
- <div class="clear"></div>
- <div class="f_left">結婚:</div>
- <div class="f_left">
- <input type="radio" name="isMarried" value="true" checked="checked"/>是
- <input type="radio" name="isMarried" value="false"/>否</div>
- <div class="clear"></div>
- <div class="f_left">興趣:</div>
- <div class="f_left">
- <input type="checkbox" name="interests" value="聽歌" checked="checked"/>聽歌
- <input type="checkbox" name="interests" value="書法" checked="checked"/>書法
- <input type="checkbox" name="interests" value="看電影" checked="checked"/>看電影
- </div>
- <div class="clear"></div>
- <div><input type="submit" value="提交表單"/></div>
- </form>
2.簡單對象類型
與基本類型相擬,只不過綁定到對象上更加簡潔.(類擬struts的ActionForm)
controller代碼
- @RequestMapping
- public void test2(User user)
- {
- System.out.println("簡單對象類型綁定=========");
- System.out.println("名字:" + user.getName());
- System.out.println("年齡:" + user.getAge());
- System.out.println("收入:" + user.getIncome());
- System.out.println("已結婚:" + user.getIsMarried());
- System.out.println("========================");
- }
user代碼
- public class User {
- private String name;
- private Integer age;
- private Boolean isMarried;
- private Double income;
- private String[] interests;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- public Boolean getIsMarried() {
- return isMarried;
- }
- public void setIsMarried(Boolean isMarried) {
- this.isMarried = isMarried;
- }
- public Double getIncome() {
- return income;
- }
- public void setIncome(Double income) {
- this.income = income;
- }
- public String[] getInterests() {
- return interests;
- }
- public void setInterests(String[] interests) {
- this.interests = interests;
- }
- }
jsp代碼
- <form action="test2.do" method="post">
- <div class="f_left">姓名:</div>
- <div class="f_left"><input name="name" value="lxf"/></div>
- <div class="clear"></div>
- <div class="f_left">年齡:</div>
- <div class="f_left"><input name="age" value="20"/></div>
- <div class="clear"></div>
- <div class="f_left">收入:</div>
- <div class="f_left"><input name="income" value="100000"/></div>
- <div class="clear"></div>
- <div class="f_left">結婚:</div>
- <div class="f_left">
- <input type="radio" name="isMarried" value="true" checked="checked"/>是
- <input type="radio" name="isMarried" value="false"/>否</div>
- <div class="clear"></div>
- <div class="f_left">興趣:</div>
- <div class="f_left">
- <input type="checkbox" name="interests" value="聽歌" checked="checked"/>聽歌
- <input type="checkbox" name="interests" value="書法" checked="checked"/>書法
- <input type="checkbox" name="interests" value="看電影" checked="checked"/>看電影
- </div>
- <div class="clear"></div>
- <div><input type="submit" value="提交表單"/></div>
- </form>
3.List類型綁定
網上很多人都給不出答案,關鍵在於,List需要綁定在對象(ActionForm),直接寫在request-mapping函數的參數是不行的,更重要的一點是要創建對象(ArrayList).
controller代碼
- @RequestMapping
- public void test3(Club club)
- {
- System.out.println("list類型綁定=========");
- System.out.println("會員:");
- for (User user : club.getUsers())
- {
- System.out.println(user.getName());
- }
- System.out.println("========================");
- }
Club代碼
- public class Club {
- private List<User> users = new ArrayList<User>();
- public List<User> getUsers() {
- return users;
- }
- public void setUsers(List<User> users) {
- this.users = users;
- }
- }
jsp代碼
- <form action="test3.do" method="post">
- <div class="f_left">會員1號:</div>
- <div class="f_left">
- <input name="users[0].name" value="張三"/>
- </div>
- <div class="clear"></div>
- <div class="f_left">會員2號:</div>
- <div class="f_left">
- <input name="users[1].name" value="李四"/>
- </div>
- <div class="clear"></div>
- <div class="f_left">會員3號:</div>
- <div class="f_left">
- <input name="users[2].name" value="王五"/>
- </div>
- <div class="clear"></div>
- <div><input type="submit" value="提交表單"/></div>
- </form>
4.Set類型綁定
與List類型相似,經測試表明,綁定Set數據時,必須先在Set對象中Add相應的數量的模型對象.
controller代碼
- @RequestMapping
- public void test4(Club2 club)
- {
- System.out.println("set類型綁定=========");
- System.out.println("會員:");
- for (User user : club.getUsers())
- {
- System.out.println(user.getName());
- }
- System.out.println("========================");
- }
Club2代碼
- public class Club2 {
- private Set<User> users = new LinkedHashSet<User>();
- public Club2() {
- users.add(new User());
- users.add(new User());
- users.add(new User());
- }
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
- }
jsp代碼
- <form action="test4.do" method="post">
- <div class="f_left">會員1號:</div>
- <div class="f_left">
- <input name="users[0].name" value="張三"/>
- </div>
- <div class="clear"></div>
- <div class="f_left">會員2號:</div>
- <div class="f_left">
- <input name="users[1].name" value="李四"/>
- </div>
- <div class="clear"></div>
- <div class="f_left">會員3號:</div>
- <div class="f_left">
- <input name="users[2].name" value="王五"/>
- </div>
- <div class="clear"></div>
- <div><input type="submit" value="提交表單"/></div>
- </form>
5.Map類型綁定
最靈活的一種方式,可無限綁定未定義的參數,注意必須綁定在對象下(ActionForm).
controller代碼
- @RequestMapping
- public void test5(UserForm userForm)
- {
- System.out.println("Map類型綁定=========");
- System.out.println("名字:" + userForm.getUser().get("name"));
- System.out.println("年齡:" + userForm.getUser().get("age"));
- System.out.println("收入:" + userForm.getUser().get("income"));
- System.out.println("已結婚:" + userForm.getUser().get("isMarried"));
- System.out.println("========================");
- }
UserForm.java代碼
- public class UserForm {
- private Map<String, String> userMap = new LinkedHashMap<String, String>();
- private User user = new User();
- public Map<String, String> getUserMap() {
- return userMap;
- }
- public void setUserMap(Map<String, String> userMap) {
- this.userMap = userMap;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
jsp代碼
- <form action="test5.do" method="post">
- <div class="f_left">姓名:</div>
- <div class="f_left"><input name="user['name']" value="張三"/></div>
- <div class="clear"></div>
- <div class="f_left">年齡:</div>
- <div class="f_left"><input name="user['age']" value="20"/></div>
- <div class="clear"></div>
- <div class="f_left">收入:</div>
- <div class="f_left"><input name="user['income']" value="100000"/></div>
- <div class="clear"></div>
- <div class="f_left">結婚:</div>
- <div class="f_left">
- <input type="radio" name="user['isMarried']" value="true" checked="checked"/>是
- <input type="radio" name="user['isMarried']" value="false"/>否</div>
- <div class="clear"></div>
- <div><input type="submit" value="提交表單"/></div>
- </form>
6.復合類型綁定
controller代碼
- @RequestMapping
- public void test6(UserForm userForm)
- {
- System.out.println("復合類型綁定=========");
- System.out.println("名字:" + userForm.getUser().getName());
- System.out.println("年齡:" + userForm.getUser().getAge());
- System.out.println("收入:" + userForm.getUser().getIncome());
- System.out.println("已結婚:" + userForm.getUser().getIsMarried());
- System.out.println("========================");
- }
UserForm代碼
- public class UserForm {
- private Map<String, String> userMap = new LinkedHashMap<String, String>();
- private User user = new User();
- public Map<String, String> getUserMap() {
- return userMap;
- }
- public void setUserMap(Map<String, String> userMap) {
- this.userMap = userMap;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
jsp代碼
- <form action="test6.do" method="post">
- <div class="f_left">姓名:</div>
- <div class="f_left"><input name="user.name" value="張三"/></div>
- <div class="clear"></div>
- <div class="f_left">年齡:</div>
- <div class="f_left"><input name="user.age" value="20"/></div>
- <div class="clear"></div>
- <div class="f_left">收入:</div>
- <div class="f_left"><input name="user.income" value="100000"/></div>
- <div class="clear"></div>
- <div class="f_left">結婚:</div>
- <div class="f_left">
- <input type="radio" name="user.isMarried" value="true" checked="checked"/>是
- <input type="radio" name="user.isMarried" value="false"/>否</div>
- <div class="clear"></div>
- <div><input type="submit" value="提交表單"/></div>
- </form>