46 votes

Spring MVC - Liaison d'un champ de date

Pour les paramètres de requête représentant des valeurs de chaîne, de nombre et de booléen, le conteneur Spring MVC peut les lier à des propriétés typées prêtes à l'emploi.

Comment le conteneur Spring MVC lie-t-il un paramètre de requête représentant une date?

En parlant de cela, comment le Spring MVC détermine-t-il le type d'un paramètre de requête donné?

Merci!

65voto

Arthur Ronald Points 19001

Comment le Spring MVC déterminer le type d'un paramètre de la requête ?

Le printemps fait usage de ServletRequestDataBinder de lier ses valeurs. Le processus peut être décrit comme suit

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

En coulisses, DataBinder instances en interne permet l'utilisation d'un BeanWrapperImpl instance qui est chargée de définir les valeurs de l'objet de commande. Avec getPropertyType méthode, il récupère le type de propriété

Si vous voyez la demande présentée ci-dessus (bien sûr, en utilisant une maquette), le Printemps sera appel

BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person);

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

Et Puis

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

Comment Spring MVC conteneur de lier un paramètre de la requête qui représente une Date ?

Si vous avez de l'homme-friendly représentation de données qui ont besoin d'une conversion, vous devez vous inscrire à un PropertyEditor Par exemple, java.util.La Date ne sais pas ce que 13/09/2010 est, alors dites-le Printemps

Printemps, convertir cet homme-friendly date à l'aide de la 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());
    }        

});

Lors de l'appel de convertIfNecessary méthode, le Printemps semble pour tout régime enregistré d'PropertyEditor qui prend en charge la conversion de la valeur soumise. Pour inscrire votre PropertyEditor, vous pouvez soit

Spring 3.0

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

Vieux style de Printemps 2.x

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

32voto

Mircea Stanciu Points 504

En complément de la réponse très complète d’Arthur: dans le cas d’un champ Date simple, il n’est pas nécessaire de mettre en œuvre l’ensemble PropertyEditor. Vous pouvez simplement utiliser un CustomDateEditor auquel vous passez simplement le format de date à utiliser:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X