之前一直以為PropertyEditor是SpringMVC提供的,今天才知道這個是jdk提供的,汗顏啊!
這個東西能幹啥用呢?可以把字符串轉成一個bean對象,spring mvc在把form表單映射到controller的入參對象就是利用的這個東西。
看一個例子:
NodeDO.java:一個標準的javabean對象
public class NodeDO {private String name;private String email;private Date date;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "NodeDO [name=" + name + ", email=" + email + ", date=" + DodeDOEditor.sdf.format(date) + "]";}}TestDO.java一樣,裡面引用了NodeDO:
public class TestDO { private String nodeName; private NodeDO nodeDO; public String getNodeName() { return nodeName; } public void setNodeName(String nodeName) { this.nodeName = nodeName; } public NodeDO getNodeDO() { return nodeDO; } public void setNodeDO(NodeDO nodeDO) { this.nodeDO = nodeDO; } }我們想實現類似這樣的功能:
public static void main(String[] args) throws Exception{ Map<String, String> parameters = new HashMap<String, String>(){ { put("nodeName", "小胖測試"); put("nodeDO", "xiaopang|[email protected]|2015-10-20 12:00:00"); } }; TestDO testDo = convert(parameters); System.out.println(testDo.getNodeName()); System.out.println(testDo.getNodeDO()); }把parameters這個map轉化成TestDO的對象,該如何來做呢?
(1)首先要定義一個用來轉化Property的PropertyEditor:
public class DodeDOEditor extends PropertyEditorSupport{ public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void setAsText(String text) throws IllegalArgumentException{ String[] tokens = text.split("//|"); NodeDO nodeDo = new NodeDO(); nodeDo.setName(tokens[0]); nodeDo.setEmail(tokens[1]); try{ nodeDo.setDate(sdf.parse(tokens[2])); }catch(ParseException e){ throw new IllegalArgumentException(e); } setValue(nodeDo); } }(2)做轉化:
public class PropertyEditorSample { static{ PropertyEditorManager.registerEditor(NodeDO.class, DodeDOEditor.class); } public static void main(String[] args) throws Exception{ Map<String, String> parameters = new HashMap<String, String>(){ { put("nodeName", "小胖測試"); put("nodeDO", "xiaopang|[email protected]|2015-10-20 12:00:00"); } }; TestDO testDo = convert(parameters); System.out.println(testDo.getNodeName()); System.out.println(testDo.getNodeDO()); } private static TestDO convert(Map<String, String> parameters)throws Exception { TestDO testDO = new TestDO(); BeanInfo bi = Introspector.getBeanInfo(TestDO.class); PropertyDescriptor[] pds = bi.getPropertyDescriptors(); for(PropertyDescriptor pd : pds){ Class<?> propertyType = pd.getPropertyType(); Method writeMethod = pd.getWriteMethod(); if(propertyType == Class.class){ //ignore }else if(propertyType == String.class){ writeMethod.invoke(testDO, parameters.get(pd.getName())); }else{ PropertyEditor editor = PropertyEditorManager.findEditor(propertyType); if(editor != null){ editor.setAsText(parameters.get(pd.getName())); writeMethod.invoke(testDO, editor.getValue()); }else{ System.out.println("no editor for:"+pd.getName()); } } } return testDO; } }其實關鍵點就兩句話
<pre name="code">editor.setAsText(parameters.get(pd.getName()));//1 editor.getValue();//2 //因此,一般都會在setAsText中去調用setValue()來保存轉化以後的值,這樣通過getValue()就能獲取到了
以上就是本次整理的全部內容,如果大家還有任何不明白的地方,可以在下方留言討論,感謝大家對武林網的支持。