Struts 1 ActionForms - Wie lautet die Konvention für Datumsangaben im Formular?

8

Ich bin dabei, mit e-Projekt zu beginnen, das Struts 1.2 verwendet. Es ist nicht geplant, in ein anderes Framework zu wechseln.

Ich wollte wissen, was die Konvention bei der Behandlung eines Datums im Formular ist?

  1. Soll ich eine Date-Variable erstellen und eine setDate(String date) -Methode erstellen, in der die Konvertierung stattfindet?

  2. Erstellen Sie eine Date-Variable, ein setDate(Date date) , und registrieren Sie einen speziellen Konverter irgendwo in der Kette? (Ich weiß nicht, ob es möglich ist)

  3. Erstellen Sie eine String-Variable, ein setDate(String date) , und lassen Sie die Konvertierung / Validierung in die validate -Methode in der ActionForm-Bean?

  4. umwandeln

Oder ein anderer Ansatz?

Wenn Sie einen Rat haben, sich mit diesem Rahmen vertraut zu machen, würde ich das sehr begrüßen.

    
Farid 15.07.2011, 12:39
quelle

1 Antwort

16

Bevor ich auf Ihre Frage antworte, möchte ich zunächst Folgendes sagen: Die Leute verstehen nicht, was ActionForm ist oder was ActionForm macht

Das ActionForm stellt die Daten dar, die der Benutzer ausgefüllt hat im HTML-Formular. Struts liest die Anforderungsparameter ein und vergleicht sie mit dem konfigurierten ActionForm für die Zielaktion des Sendens. Es sind Daten, die vom Benutzer einfach und einfach eingegeben werden.

Daten, die in der Anfrage eingehen, haben immer den Typ java.lang.String . Aber Leute haben vielleicht ein Formularfeld namens "age", das ein int in ihren Model-Daten ist. Oder vielleicht haben sie statt "alter" ein "birthDate", was natürlich java.util.Date in ihren Model-Daten ist. Daher halten sie es für eine gute Idee, den Typ int und Date in ActionForm zu platzieren und es Struts zu ermöglichen, die auf Anforderung eingehenden Strings in Ints und Dates zu konvertieren.

Es ist eine sehr nützliche Konvertierung und Sie als Entwickler müssen nicht damit umgehen, Struts tut. Es ist ein bisschen Framework Magie.

Aber das ist nicht Harry Potter verdammt! Die Konvertierung kann bei Einträgen und Daten fehlschlagen . Warum?

int ist ein primitiver Typ und als solcher muss er immer einen Wert haben. Standard-Initialisierung ist mit Null. Beim Binden (Anforderung von Parametern an ActionForm-Objekteigenschaften) sieht Struts einen int-Typ im ActionForm und versucht, den Anforderungszeichenfolgewert in int zu konvertieren.

Wenn der Benutzer String "5" eingefügt hat, wird das Feld auf 5 gesetzt. Das ist in Ordnung!

Aber was ist, wenn der Benutzer "bla" einfügt? Werden wir eine Ausnahme in unserem Gesicht bekommen? Nee! Wir erhalten einen Wert von Null zurück, weil die Konvertierung (im Hintergrund) fehlgeschlagen ist. Ups!

Termine sind wieder ein Problem. Warum? Weil ihr Wert auf Anfrage als String ankommt. Ihr Format könnte etwas Einfaches wie "12/01/2011" sein, was als Information völlig nutzlos ist. Warum? Weil Daten, die als Zeichenfolgen dargestellt werden, mit einem Gebietsschema einhergehen müssen > Um in die richtige Date-Instanz umgewandelt zu werden, repräsentiert es.

%Vor%

Ups!

Ok, also das war das Intro! Gehen wir nun zu Ihrer Frage .

  
  1. Soll ich eine Date-Variable erstellen und eine setDate (String date) -Methode erstellen, bei der die Konvertierung stattfindet.
  2.   

An einem bestimmten Punkt müssen Sie das Datum an die Ansicht und die Struts-HTML-Tags zurücksenden muss normalerweise für ein getDate() gehen, das String zurückgibt. Der "12/01/2011", den Sie bei Benutzereingaben erhalten, wird möglicherweise als "12. Januar 2011 00:00:00" angezeigt, wenn der Getter das Datum zurückgibt (Struts macht% code_% auf den Getter-Wert). Sie benötigen also das Date-Feld sowohl mit einem Setter / Getter vom Typ Date als auch mit einem Setter / Getter vom Typ String. Verwenden Sie den Typ Date in Ihrer Action-Klasse und verwenden Sie String als Schnittstelle zu den View-Tags.

Frage? Wie erhalten Sie den richtigen Locale-Wert in Ihrem ActionForm?

  
  1. Erstelle eine Date-Variable, ein setDate (Date date) und registriere einen speziellen Konverter irgendwo in der Kette (weiß nicht, ob es möglich ist)
  2.   

Es ist möglich . Sie können einen benutzerdefinierten Konverter erstellen und registrieren, der String-Darstellungen von Daten übernehmen und in Datum konvertieren kann. Wenn Sie das Format ISO 8601 verwenden, werden Sie sicher sein.

Frage? Können Sie dies in die vorhandene Anwendung integrieren, ohne Code zu unterbrechen, der String auf eigene Weise in Daten umwandelt, indem Sie alle möglichen Formate oder Locales verwenden?

  
  1. Erstellen Sie eine String-Variable, ein setDate (String date) und lassen Sie die Konvertierung / Validierung in die validate-Methode in der actionForm-Bean
  2. umwandeln   

Das wird nicht funktionieren. Die Methode toString() wird nach den Parameterbindungen des ActionForm-Objekts aufgerufen. Wenn Sie diesen Punkt erreichen, ist es schon zu spät. Struts hat die Konvertierung gemacht. Wenn Sie ein Feld vom Typ int mit dem Wert Null haben, gibt es keine Möglichkeit zu wissen, ob der Benutzer tatsächlich Null eingefügt hat und ob die Konvertierung durchgeführt wurde oder ob der Benutzer "bla" eingefügt hat und die Konvertierung fehlgeschlagen ist und Sie Null als Standardinitialisierungswert erhalten haben. Wenn Null ein gültiger Wert für Ihre Anwendung ist, sind Sie in noch größeren Schwierigkeiten.

Also, was ist die Konvention?

Es gibt keine Konvention. Verwenden Sie die obigen Informationen und wenden Sie bei Ihrer Situation gesunden Menschenverstand an.

Idealerweise sollten Sie alle Eigenschaften im ActionForm als Strings haben , damit Sie während des Bindens keine Informationen verlieren.Das bedeutet jedoch, dass Sie die Eigenschaften manuell in den richtigen Typ in der Action-Klasse konvertieren müssen, bevor Sie sie verwenden. Sie haben die volle Kontrolle (Struts führt keine Konvertierungen mehr durch, da die Quell- und Zielwerte vom Typ String sind), aber Sie haben auch eine Menge Code, um es auf die richtige Art und Weise zu schreiben, die irgendwann ärgerlich werden kann.

P.S. Bevor ich das beende und ins Bett gehe (es ist 01:00 Uhr in meinem Land: D) möchte ich nur eine Sache erwähnen, die die Leute oft nicht sehen. Das ActionForm ist nicht Teil des Modells und sollte auch nicht direkt mit dem Modell interagieren.

Wenn Sie möchten, dass die Daten aus dem ActionForm im Modell verarbeitet werden, ordnen Sie sie als 1: 1-Beziehungen mit einem Modell-DTO (Datenübertragungsobjekt) zu. Wenn Sie dies nicht tun, erstellen Sie eine enge Kopplung zwischen dem Modell und dem Struts-Framework, da Ihre ActionForm-Objekte keine POJOs sind. Ihre Klasse muss die ActionForm-Klasse von Struts, über die wir gesprochen haben, erweitern. Leute tun das nicht und senden das ActionForm direkt an das Model. Was noch schlimmer ist, ist, dass sie auch die validate -Methode verwenden, um Business-Validierungen anstelle von grundlegenden Validierungen durchzuführen, wie "ist erforderlich", "ist der Wert, der den Bereich berührt", etc.

ActionForms sind nur ein Kommunikationspfad zwischen der Aktion (Controller) und der Ansicht. Behandle es so.

    
user159088 15.07.2011 22:01
quelle

Tags und Links