2010-09-14 18 views
40

Bei Anfrageparametern, die string-, number- und boolesche Werte darstellen, kann der Spring MVC-Container sie an typisierte Eigenschaften binden.Spring MVC - Binden eines Datumsfelds

Wie bindet der Spring MVC-Container einen Anforderungsparameter, der ein Date darstellt?

Apropos, wie bestimmt die Spring MVC den Typ eines bestimmten Anforderungsparameters?

Danke!

Antwort

62

Wie bestimmt der Spring MVC den Typ eines bestimmten Anforderungsparameters?

Spring verwendet ServletRequestDataBinder, um seine Werte zu binden. Der Prozess kann wie folgt beschrieben werden

/** 
    * Bundled Mock request 
    */ 
MockHttpServletRequest request = new MockHttpServletRequest(); 
request.addParameter("name", "Tom"); 
request.addParameter("age", "25"); 

/** 
    * Spring create a new command object before processing the request 
    * 
    * By calling <COMMAND_CLASS>.class.newInstance(); 
    */ 
Person person = new Person(); 

...

/** 
    * And Then with a ServletRequestDataBinder, it bind the submitted values 
    * 
    * It makes use of Java reflection To bind its values 
    */ 
ServletRequestDataBinder binder = ServletRequestDataBinder(person); 
binder.bind(request); 

Hinter den Kulissen DataBinder Instanzen macht intern Verwendung eines BeanWrapperImpl Instanz, die die Werte des Befehlsobjekts für einzurichten verantwortlich ist. Mit getPropertyType Methode ruft es die Eigenschaft Typ

Wenn Sie den eingereichten Antrag oben sehen (natürlich durch ein Mock verwenden), Frühling

BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person); 

Clazz requiredType = beanWrapper.getPropertyType("name"); 

rufen und dann

beanWrapper.convertIfNecessary("Tom", requiredType, methodParam) 

Wie bindet Spring MVC Container einen Anforderungsparameter, der ein Date darstellt?

Wenn Sie menschenfreundliche Darstellung von Daten, die spezielle Konvertierung benötigt, müssen Sie ein PropertyEditor Zum Beispiel registrieren, java.util.Date nicht weiß, was 13.09.2010, so dass Sie Frühling sagen

Frühling, wandeln diese menschenfreundliche Datum durch die folgende Property mit

binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { 
    public void setAsText(String value) { 
     try { 
      setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value)); 
     } catch(ParseException e) { 
      setValue(null); 
     } 
    } 

    public String getAsText() { 
     return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue()); 
    }   

}); 

Wenn convertIfNecessary Methode aufrufen, Frühling für jeden Registere sieht d PropertyEditor, der sich um die Konvertierung des übergebenen Wertes kümmert. Zur Registrierung des Property, können Sie entweder

Frühling 3,0

@InitBinder 
public void binder(WebDataBinder binder) { 
    // as shown above 
} 

alten Stil Frühling 2.x

@Override 
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
    // as shown above 
} 
+0

Vielen Dank. –

+1

Frühling 2.5.x hat auch einen @InitBinder: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-initbinder – Rihards

+2

Vielen Dank, weil dies scheint ein umfassende Antwort, aber für die Nicht-Experten würde es wirklich helfen, ein einfaches praktisches Beispiel zu enthalten. – Marquez

30

In Ergänzung zu Arthurs sehr vollständige Antwort: Im Falle eines einfachen Datum In diesem Feld müssen Sie nicht den gesamten PropertyEditor implementieren. Sie können einfach eine CustomDateEditor verwenden, an die Sie einfach das zu verwendende Datumsformat übergeben:

+0

Wenn Sie Ihrem Code Kommentare hinzufügen, kann das OP Ihren Antwortvorschlag besser verstehen. Überprüfen Sie diese [metaSO Frage] (http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) und [Jon Skeet: Coding Blog] (http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpully.aspx), um eine korrekte Antwort zu geben. – Yaroslav