Archive for Februar, 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.

Manche Dinge fallen einem nur dann auf, wenn es in den kritischen Zustand rutscht. In diesem Fall betrifft das meine Systempartition, deren Speicherplatz sich dem Ende neigt. Durch dieses Problem habe ich gesehen, wie WinRAR arbeitet, und was den Unterschied macht zwischen dem Kontextmenübefehl “Hier entpacken…” (Extract here …) und einem Drag&Drop einer Datei aus dem geöffneten Archiv aus.

Wenn ihr das Archiv öffnet und eine darin enthaltene Datei per Drag&Drop in ein Verzeichnis kopiert, dann erzeugt WinRAR ein temporäres Verzeichnis unter eurem Benutzer, was standardmäßig mal auf der (bei mir vollen) Systempartition liegt. In meinem Fall handelte es sich hierbei um knapp 1GB Daten. Diese wurden also erst auf die Systempartition extrahiert und von dort dann in das gewünschte Verzeichnis verschoben.

Mit dem Befehl “Hier extrahieren…” kann man das Problem allerdings umgehen. In diesem Fall extrahiert WinRAR die Datei(en) direkt in das gewünschte Verzeichnis, ohne Umweg über einen Temp-Ordner (oder Datei).

Warum das so umgesetzt wurde würde mich allerdings schon interessieren. Wozu der Umweg?
Naja, solltet ihr wie ich das Speicherplatzproblem haben, einfach über den richtigen Befehl im Kontextmenü gehen, dann funktioniert das auch.

Vielleicht kennt das der ein oder andere von euch:
Man sitzt entspannt beim Programmieren und hört dabei leise über Kopfhörer Musik. Da wir ja alle schnelle Entwickler sind, beherrschen wir das 10 Finger-System und hauen ordendlich in die Tasten .. und erwischen auf unserem ThinkPad ausversehen mal 3 Tasten gleicheitig BEEEEEEEEEP. *Autsch* da kommt einem gleich das Hirn durch die Nase und schlabbert über die Tastatur … denn dieser Beep hat alles andere als die vom Betriebssystem eingestellte Lautstärke.

Ich rede hier von MS Windows XP und habe an dieser Stelle keine Erfahrung mit anderen Betriebssystemen. Der Weg über BIOS hat bei meinem R60 nicht funktioniert, obwohl manche ThinkPads diese Option in ihrem BIOS laut Internetrecherche besitzen.
Den Lösungsweg unter Windows aber habe ich endlich gefunden:

  1. Systemsteuerung > System > Hardware > Geräte Manager 
  2. Ansicht > Ausgeblendete Geräte anzeigen 
  3. Im Baum ‘Nicht-PNP-Treiber’ > Beep > rechte Maustaste > Deaktivieren

Endlich kehrt wieder Ruhe in das Entwicklerleben ein; und wenn ich mal wieder zu schnell tippe, dann vibriert der Schädel nicht gleich wieder.

Ja, manch einer wird jetzt sagen: “Die Beeps sind für Warnhinweise” … schon klar … aber lieber einen Warnhinweis nicht mitbekommen, als Taub durch die Gegend zu rennen … und gerade bei Tastatureingaben sehe ich ja wohl, wenn ein oder mehrere Zeichen nicht angekommen sind.