Validering

12-01-2009
 

En ekstrem vigtig del af en applikation er validering. Og ofte er denne del meget overset i diverse web frameworks. Specielt muligheden for på simpel vis at fejlmelde på feltniveau uden at skulle tilføje en masse kode.


Wicket har desværre ikke løst dette optimalt, men fordelen ved wicket er at du selv kan løse dette problem.


Mit ønske her er at jeg kan tilføje mine felter til min form og hvis et felt ikke er validt, så vil jeg have at feltet markeres med rød baggrundsfarve, således at min bruger kan se hvilke felter der ikke er valide.


Jeg vil ikke skulle tilføje noget til alle felter i min html, og jeg vil heller ikke skulle kode en masse i den enkelte form. Og netop dette er det smukke ved wicket. Jeg kan opnå mit resultat med lidt css (det slipper jeg ikke for), og resten er good old plan java.


Wicket componenter har allerede muligheden for at registrere en Behavior, som vil blive anvendt på komponenter hvor den registreres. Så det vi starter med er at lave en Behavior der undersøger om feltet (componenten) er validt, og hvis det er det sættes class til valid ellers sættes class til invalid. (class refererer her til html, hvor komponentens class vil blive sat.)


Denne klasse kunne se således ud:


01
public class ValidationStyleBehavior extends AbstractBehavior {
02
  public void onComponentTag(final Component component, final ComponentTag tag) {
03
      FormComponent comp = (FormComponent) component;
04
      if (comp.isValid() && comp.getConvertedInput() != null) {
05
         tag.getAttributes().put("class", "valid");
06
      } else if (!comp.isValid()) {
07
         tag.getAttributes().put("class", "invalid");
08
      }
09
  }
10
}


Dette betyder at jeg skal have noget css med en class som kunne se således ud:


01
.valid { background : #222222; }
02
.invalid { background : #FF0000; }


Nu skal vi så bare have tilføjet vores ValidationStyleBehavior til alle vores felter.

Dette kan naturligvis gøres ved på alle vores felter at lave en add(new ValidationStyleBehavior());


Dette giver dog en hel del kode i alle mine forms, så som alternativ til dette vælger jeg at extende TextField og andre komponenter som skal valideres.


Det kunne se således ud:


01
public TextField(String id, IModel<T> model) {
02
  super(id, model);
03
  add(new ValidationStyleBehavior());
04
}


Her vises kun en enkelt constructor, men du bør overskrive alle constructors i TextField.


Herefter handler det blot om at anvende din egen TextField klasse i stedet for standard versionen, og alle felter vil nu få en rød baggrund hvis der er fejl i feltet.


Dette kan naturligvis udvides så du feks får vist fejlmeddelelser til feltet i forbindelse med feltet. Dette kan naturligvis også løses ved lidt tilføjelse til den Behavior.

Du skal så blot huske også at overskrive din FeedBackPanel klasse. Her kan du feks vælge ikke at vise fejl som relaterer sig til specifikke felter, eller simpelthen ikke viser fejl.


Ovenstående er specifikt rettet mod valideringer som foretages ved submit at formen, men den kan nemt ændres så der valideres aktivt mens formen udfyldes.

Dette gøres ved at lave en AjaxBehavior som foretager valideringen på onblur, på denne måde kan du få fejlmeldinger på felter når brugeren forlader et felt.


Dette kan have en fordel, men kan også virke forstyrrende afhængigt af situationen. Det er derfor min erfaring at man skal passe på med den type validering, og jeg vælger ofte selv kun at tilføje denne type validering i meget specifikke forms.
 
 
©2008 JLSoft