一、相關的類:
java
查看spring源碼能夠看出spring支持轉換的數據類型:
org.springframework.beans.PropertyEditorRegistrySupport:spring
private void createDefaultEditors() { app
this.defaultEditors = new HashMap(64); jsp
// Simple editors, without parameterization capabilities. ide
// The JDK does not contain a default editor for any of these target types. post
this.defaultEditors.put(Charset.class, new CharsetEditor()); this
this.defaultEditors.put(Class.class, new ClassEditor()); spa
this.defaultEditors.put(Class[].class, new ClassArrayEditor()); code
this.defaultEditors.put(Currency.class, new CurrencyEditor()); orm
this.defaultEditors.put(File.class, new FileEditor());
this.defaultEditors.put(InputStream.class, new InputStreamEditor());
this.defaultEditors.put(InputSource.class, new InputSourceEditor());
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());
this.defaultEditors.put(UUID.class, new UUIDEditor());
// 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);
}
}
二、基本數據類型綁定:
@RequestMapping("test.do")
public void test(int num) {
}
"test.do" method="post">
"num" value="10" type="text"/>
......
注意:表單中input的name值和Controller的參數變量名保持一致,就能完成基本數據類型的數據綁定,若是不一致能夠使用@RequestParam標註實現。值得一提的是,若是Controller方法參數中定義的是基本數據類型,可是從jsp提交過來的數據爲null或者""的話,會出現數據轉換的異常。也就是說,必須保證表單傳遞過來的數據不能爲null或"",因此,在開發過程當中,對可能爲空的數據,最好將參數數據類型定義成包裝類型。
三、包裝類型
@RequestMapping("test.do")
public void test(Integer num) {
}
"test.do" method="post">
"num" value="10" type="text"/>
......
和基本數據類型基本同樣,不一樣之處在於,JSP表單傳遞過來的數據能夠爲null或"",以上面代碼爲例,若是jsp中num爲""或者表單中無num這個input,那麼,Controller方法參數中的num值則爲null。
四、自定義對象類型
public class User {
private String firstName;
private String lastName;
...
}
@RequestMapping("test.do")
public void test(User user) {
}
"test.do" method="post">
"firstName" value="張" type="text"/>
"lastName" value="三" type="text"/>
......
只需將對象的屬性名和input的name值一一對應便可。
五、自定義複合對象類型
public class ContactInfo {
private String tel;
private String address;
。。。
}
public class User {
private String firstName;
private String lastName;
private ContactInfo contactInfo;
。。。
}
@RequestMapping("test.do")
public void test(User user) {
System.out.println(user.getFirstName());
System.out.println(user.getLastName());
System.out.println(user.getContactInfo().getTel());
System.out.println(user.getContactInfo().getAddress());
}
<</span>form action="test.do" method="post">
<</span>input name="firstName" value="張" /><</span>br>
<</span>input name="lastName" value="三" /><</span>br>
<</span>input name="contactInfo.tel" value="13809908909" /><</span>br>
<</span>input name="contactInfo.address" value="北京海淀" /><</span>br>
<</span>input type="submit" value="Save" />
</</span>form>
User對象中有ContactInfo屬性,Controller中的代碼和第3點說的一致,可是,在jsp代碼中,須要使用「屬性名(對象類型的屬性).屬性名」來命名input的name。