Spring MVC – Binding a Date Field

Per i parametri di richiesta che rappresentano stringhe, numeri e valori booleani, il contenitore MVC Spring può associarli a proprietà tipizzate.

Come si dispone del contenitore MVC di Spring per associare un parametro di richiesta che rappresenta una data?

A proposito, in che modo il MVC di Spring determina il tipo di un determinato parametro di richiesta?

Grazie!

In che modo MVC Spring determina il tipo di un determinato parametro di richiesta?

Spring utilizza ServletRequestDataBinder per associare i suoi valori. Il processo può essere descritto come segue

/** * 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 .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); 

Dietro le quinte, le istanze di DataBinder utilizzano internamente un’istanza BeanWrapperImpl che è responsabile della configurazione dei valori dell’object comando. Con il metodo getPropertyType , recupera il tipo di proprietà

Se vedi la richiesta inviata sopra (ovviamente, usando una simulazione), Spring chiamerà

 BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person); Clazz requiredType = beanWrapper.getPropertyType("name"); 

E poi

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

In che modo il contenitore MVC di Spring associa un parametro di richiesta che rappresenta una data?

Se si dispone di una rappresentazione umana dei dati che richiede una conversione speciale, è necessario registrare un PropertyEditor Ad esempio, java.util.Date non sa cosa sia il 13/09/2010, quindi dici a Spring

Spring, converti questa data umana-amichevole usando il seguente PropertyEditor

 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()); } }); 

Quando si chiama il metodo convertIfNecessario, Spring cerca qualsiasi PropertyEditor registrato che si occupi della conversione del valore inviato. Per registrare il tuo PropertyEditor, puoi o

Spring 3.0

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

Vecchia spring 2.x

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

In aggiunta alla risposta molto completa di Arthur: nel caso di un campo Data semplice, non è necessario implementare l’intero PropertyEditor. Puoi semplicemente usare CustomDateEditor al quale devi semplicemente passare il formato della data da usare:

 //put this in your Controller //(if you have a superclass for your controllers //and want to use the same date format throughout the app, put it there) @InitBinder private void dateBinder(WebDataBinder binder) { //The date format to parse or output your dates SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); //Create a new CustomDateEditor CustomDateEditor editor = new CustomDateEditor(dateFormat, true); //Register it as custom editor for the Date type binder.registerCustomEditor(Date.class, editor); }