Archive for Februar 19th, 2009

Ein Problem bei Struts ist, dass man nicht mehrere Formulare auf einer Seite haben kann, da das ActionMapping immer genau eine FormBean konfigurieren kann. Benötigt man jedoch eine solche Konstellation, muss man sich mit anderen Tricks helfen.

In meinem Fall habe ich ein Formular verwendet und dieses mit einem hidden-field ausgestattet. Per JavaScript wird bei verschiedenen Buttons zunächst das hidden-field gesetzt, und dann die Form abgeschickt. In der Action werden dann nur die entsprechenden Felder ausgewertet, die unter die Kategorie des Flags im hidden-field fallen. Soweit so gut, aber was ist mit Validierung?

Bei meiner Konstellation muss die Validierung über die validate()-Methode im FormBean geschehen, da ja je nach gesetztem Flag nicht alle Felder benötigt und somit nicht validiert werden. Die validation.xml kann in diesem Fall leider nicht verwendet werden, da diese immer die komplette FormBean überprüft, ungeachtet der Tatsache, dass ja nur ein Teil der FormBean-Daten zur Weiterverarbeitung verwendet werden soll.

Da Struts die Apache Commons Validations Bibliothek implementiert, kann dieses Framework auch gut vom Programmcode aus genutzt werden. Mein Problem war bspw. die Überprüfung eines Datums mit der richtigen Schreibweise. Hierfür gibt es schon eine fertige DateValidation.

Meine validate()-Methode sieht dann so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
  ActionErrors errors = super.validate(mapping, request);
  SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN);
 
  // überprüfen, welcher Formularteil ausgewertet werden soll
  if (this.hiddenFieldFlag.equals("firstForm")) {
    // Überprüfung des Datumsformates
    boolean checkDate = DateValidator.getInstance().isValid(date, sdf.toPattern(), true);
    /*
     * ... weitere Validierungen und ggf. ActionErrors setzen ...
     */
  }
  if (this.hiddenFieldFlag.equals("secondForm")) {
    // ...
  }
  return errors;
}

Einen anderen Weg, auf die vorkonfigurierten Validierungen der XML-Datei zuzugreifen, habe ich bisher leider nicht gefunden. Sollte jemand hierfür eine Lösung haben, wäre ich dankbar für die Information.