1. Die Bedeutung der Typkonvertierung
Für ein intelligentes MVC-Framework ist es unvermeidlich, eine Typkonvertierung zu implementieren. Da die Anforderungsparameter von B/S-Strukturanwendungen (Browser/Server) über den Browser gesendet werden, können diese Parameter keine Rich-Datentypen aufweisen Die Konvertierung muss serverseitig abgeschlossen werden
Das MVC-Framework ist eine Präsentationsschichtlösung und sollte Unterstützung für die Typkonvertierung bieten. Struts2 bietet eine sehr leistungsstarke Unterstützung für die Typkonvertierung.
2. Verarbeitung von Präsentationsschichtdaten
1. Bei Webanwendungen wird die Präsentationsschicht hauptsächlich zur Interaktion mit Benutzern verwendet, einschließlich der Erfassung von Benutzereingabedaten und der Präsentation des Serverstatus für Benutzer. Daher hat der Datenfluss in der Präsentationsschicht hauptsächlich zwei Richtungen: Eingabedaten und Ausgabedaten.
2. Für Eingabedaten: Es ist notwendig, die Konvertierung von Zeichenfolgendaten in mehrere Datentypen abzuschließen. Das Programm kann in der Regel nicht automatisch abgeschlossen werden und muss manuell im Code konvertiert werden.
3. Für Ausgabedaten: Sowohl Java als auch JSP unterstützen die direkte Ausgabe mehrerer Datentypen.
4. Eine weitere Datenverarbeitung in der Präsentationsschicht ist die Datenüberprüfung, die in Client-Überprüfung und serverseitige Überprüfung unterteilt ist. Dies wird später ausführlich erläutert.
3. Typkonvertierung
1. HTTP-Parameter sind alle String-Typen. Die gespeicherten Daten können vom Typ Zeichenfolge, Zahl, Boolescher Wert, Datum und Uhrzeit usw. oder vom Typ JavaBean sein. Manuelle Typkonvertierung, z. B. Konvertieren einer Zeichenfolge in ein Datum, indem: die Zeichenfolge über die Methode „request.getParameter“ abgerufen wird und überprüft wird, ob sie leer ist;
2. Struts2-Typkonvertierung
In Struts2 integrierte Typkonvertierung
String und Boolean vervollständigen die Konvertierung zwischen String- und Booleschen Werten
String- und Zeichenkonvertierung zwischen gewöhnlichen Strings und Zeichen
String, int und Integer vervollständigen die Konvertierung zwischen Strings und Integer.
String und Long vervollständigen die Konvertierung zwischen String- und Long-Integer-Werten
String, Double und Double vervollständigen die Konvertierung von Strings und Gleitkommawerten mit doppelter Genauigkeit.
String und Float vervollständigen die Konvertierung zwischen Strings und Gleitkommazahlen mit einfacher Genauigkeit
String und Date vervollständigen die Konvertierung zwischen String- und Datumstypen. Das Datumsformat verwendet das SHORT-Format des Gebietsschemas, in dem der Benutzer das Format anfordert.
String und Array Im Standardfall ist das Array-Element ein String. Wenn der Benutzer einen Typkonverter definiert, können es auch andere zusammengesetzte Datentypen sein.
String und Map und List
In Struts2 integrierte Typkonvertierung
String und Boolean vervollständigen die Konvertierung zwischen String- und Booleschen Werten
String- und Zeichenkonvertierung zwischen gewöhnlichen Strings und Zeichen
String, int und Integer vervollständigen die Konvertierung zwischen Strings und Integer.
String und Long vervollständigen die Konvertierung zwischen String- und Long-Integer-Werten
String, Double und Double vervollständigen die Konvertierung von Strings und Gleitkommawerten mit doppelter Genauigkeit.
String und Float vervollständigen die Konvertierung zwischen Strings und Gleitkommazahlen mit einfacher Genauigkeit
String und Date vervollständigen die Konvertierung zwischen String- und Datumstypen. Das Datumsformat verwendet das SHORT-Format des Gebietsschemas, in dem der Benutzer das Format anfordert.
String und Array Im Standardfall ist das Array-Element ein String. Wenn der Benutzer einen Typkonverter definiert, können es auch andere zusammengesetzte Datentypen sein.
String und Map und List
3. Integrierte Typkonvertierung
4. Struts-Typkonvertierungs-API
Der Typkonverter von Struts2 wird tatsächlich basierend auf OGNL implementiert. Im OGNL-Projekt gibt es eine Schnittstelle, die zur Implementierung des Typkonverters implementiert werden muss. Die Schnittstelle ist wie folgt definiert:
öffentliche Schnittstelle TypeConverter {
öffentliches Objekt konvertierenValue(Map arg0, Objekt arg1, Mitglied arg2, String arg3,
Objekt arg4, Klasse arg5) {
null zurückgeben;
}
Um einen Typkonverter zu implementieren, müssen Sie den oben genannten TypeConverter implementieren. Die Methoden in der obigen Schnittstelle sind jedoch zu kompliziert, daher stellt das OGNL-Projekt auch eine Implementierungsklasse dieser Schnittstelle bereit: ognl.DefaultTypeConverter diese Klasse erben. Die Klasse ist wie folgt definiert:
Die öffentliche Klasse DefaultTypeConverter erweitert Object implementiert TypeConverter{
öffentliches Objekt ConvertValue(Map<String,Object>context, Objectvalue, ClasstoType) {
}
……//Andere Methoden
}
Die Rolle der ConvertValue-Methode besteht darin, die Typkonvertierung abzuschließen. Diese Typkonvertierung ist jedoch bidirektional. Wenn eine Objektinstanz in eine Objektinstanz konvertiert werden muss, wird diese Methode ebenfalls verwendet gebraucht. Diese Konvertierung erfolgt über den toType-Parametertyp, der der Zieltyp ist, der konvertiert werden muss. Daher kann die Konvertierungsrichtung anhand des toType-Parameters bestimmt werden.
ConvertValue-Methodenparameter und Rückgabebedeutung Der erste Parameter: context ist der Kontext der Typkonvertierungsumgebung. Der zweite Parameter: value ist der Parameter, der konvertiert werden muss. Der Wert des Wertparameters ist ebenfalls unterschiedlich, je nach Konvertierungsrichtung.
Der dritte Parameter: toType ist der konvertierte Zieltyp. Der Rückgabewert dieser Methode ist der Wert nach der Typkonvertierung. Mit der Richtung der Konvertierung ändert sich auch die Art des Werts. Es ist ersichtlich, dass die konvertierte Methode „convertValue“ den zu konvertierenden Wert akzeptiert, der zu konvertierende Zieltyp ein Parameter ist und dann den konvertierten Zielwert zurückgibt.
Warum ist Value ein String-Array?
Für den DefaultTypeConverter-Konverter muss er die häufigste Situation berücksichtigen, sodass er alle Anforderungsparameter als String-Arrays und nicht als Strings behandelt. Entspricht den von getParameterValues() erhaltenen Parameterwerten
4. Implementierung des Typkonverters
1. Registrierungsseite für den ersten Schritt
2. Der zweite Schritt: Implementieren Sie die Benutzerkapselungsklasse
3. Der dritte Schritt: Implementieren Sie die Action-Klasse
5. Schritt 5: Registrieren Sie den Typkonverter. Es gibt drei Registrierungsmethoden:
1. Registrieren Sie einen lokalen Typkonverter: Der lokale Typkonverter funktioniert nur mit den Eigenschaften einer bestimmten Aktion
2. Registrieren Sie einen globalen Typkonverter: Der globale Typkonverter wirkt sich auf alle spezifischen Attribute von Action aus.
3. Verwenden Sie JDK1.5-Annotationen, um den Typkonverter zu registrieren: Generieren Sie den Typkonverter durch Registrierung.
6. Format des Registrierungsdateinamens für die Registrierung eines partiellen Typkonverters: ActionName-conversion.properties: ActionName ist der Klassenname der Aktion, die der Konverter benötigt, um wirksam zu werden, und die folgende Zeichenfolge -conversion.properties ist eine typische Eigenschaftendatei beim Fixieren von Teilen oder mehr von der Datei. Sie besteht aus Schlüssel-Wert-Paaren: propertyName = Typkonverterklasse. Das Folgende ist der Inhalt der Datei UserAction-conversion.properties.
#Geben Sie an, dass das Benutzerattribut in UserAction die Klasse redarmy.user.UserConverter verwenden muss, um die Typkonvertierung abzuschließen
user=redarmy.user.UserConverter
Hinweis: Die obige Eigenschaftendatei muss sich im selben Paket wie UserAction befinden. Das heißt, im obigen Fall kann die obige Methode verwendet werden, um eine lokale Typkonvertierung zu erreichen.
7. Das Dateiformat des globalen Typkonverters: Datei xwork-conversion.properties. Diese Datei ist auch eine Eigenschaftendatei und ihr Inhalt besteht ebenfalls aus dem Element „zusammengesetzter Typ = entsprechende Typkonverterklasse“.
Das Folgende ist der Inhalt der Datei xwork-conversion.properties:
#Geben Sie den Typkonverter aller redarmy.user.User-Klassen als redarmy.user.UserConverter an
redarmy.user.User=redarmy.user.UserConverter
Hinweis: Die Datei xwork-conversion.properties muss im Klassenordner, also unter src, erstellt werden.
5. Konvertierung des benutzerdefinierten Struts2-Typs
Die StrutsTypeConverter-Klasse wird in Struts2 bereitgestellt, um das Design der benutzerdefinierten Typkonvertierung zu vereinfachen. Diese Klasse verfügt über zwei abstrakte Methoden, die implementiert werden müssen:
(1) öffentliches Objekt ConvertFromString(Map context, String[] Values, Class toClass);
Parameter der Verarbeitungsmethode, die zum Konvertieren von Daten vom Typ „String“ in benutzerdefinierte Typen verwendet werden:
Kontext --- Kontextinformationen im Zusammenhang mit der Aktion
Werte --- Parameterwerte, die aus der Anfrage erhalten wurden
toClass --- der zu konvertierende Zieltyp
(2) public String ConvertToString(Map context, Object obj);
Wird zum Konvertieren benutzerdefinierter Typen in String verwendet
Parameter:
Kontext --- Kontextinformationen im Zusammenhang mit der Aktion
obj --- benutzerdefiniertes Objekttyp
Beispielanalyse: Design und Konfiguration einer Datumstypkonvertierung
(1) Entwerfen Sie MyDateTypeConverter, erben Sie StrutsTypeConverter und decken Sie zwei seiner Methoden ab. Der Referenzcode lautet wie folgt:
öffentliches Objekt konvertierenFromString(Zuordnungskontext, String[]-Werte, Klasse toKlasse) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
versuchen{
Datum v = sdf.parse(values[0]);
Rückkehr v;
}catch(Ausnahme e){
e.printStackTrace();
return new Date();
}
}
Fortsetzung
public String ConvertToString(Map context, Object obj) {
SimpleDateFormat sdf = new SimpleDateFormat("JJJJ Jahr MM Monat TT Tag");
Datum v = (Datum)obj;
return sdf.format(v);
}
Obwohl Struts2 standardmäßig die Konvertierung von Zeichenfolgen und Datum unterstützt, unterstützt es nur die Konvertierung von Kurzformaten und lokalisierten Datumsformaten, was möglicherweise nicht Ihren Anforderungen entspricht. Wir müssen unsere eigene Typkonvertierung implementieren.
(2) Fügen Sie der UserInfo-Klasse ein Geburtstagsattribut hinzu, dessen Typ java.util.Date ist
öffentliche Klasse UserInfo {
private Ganzzahl-ID;
privater String-Name;
privates String-Passwort;
privates Datum Geburtstag;
...
}
(3) Konfigurieren Sie den Typkonverter für die UserInfo-Komponente. Erstellen Sie zunächst eine Eigenschaftendatei basierend auf dem Klassennamen der UserInfo-Komponente.
Zum Beispiel UserInfo-conversion.properties
Diese Datei muss sich im selben Paket wie die UserInfo-Komponente befinden.
Das Inhaltsformat dieser Feature-Datei ist wie folgt:
Geburtstag=demo.converter.MyDateTypeConverter
veranschaulichen:
Geburtstag ist der Attributname des Typs java.util.Date in der UserInfo-Komponente
demo.converter.MyDateTypeConverter ist eine benutzerdefinierte Konvertierungsimplementierungsklasse
Das Strus2-Framework berücksichtigt dies und bietet eine einfache Möglichkeit, damit umzugehen.
Um den Typkonverter auf globaler Ebene zu konfigurieren, schreiben Sie einfach eine Eigenschaftendatei mit dem Namen xwork-conversion.properties, die sich im Verzeichnis /WEB-INF/classes befinden muss, mit folgendem Inhalt:
java.util.Date=demo.converter.MyDateTypeConverter
6. Benutzerdefinierter Typkonverter
Eigenschaften vom Typ java.util.Date können Anforderungsparameterwerte im Format 20.07.2009 empfangen. Wenn wir jedoch Anforderungsparameter im Format 20091221 empfangen müssen, müssen wir einen Typkonverter definieren, andernfalls kann struts2 die Typkonvertierung nicht automatisch abschließen.
import java.util.Date;
öffentliche Klasse HelloWorldAction {
privates Datum, Erstellungszeit;
öffentliches Datum getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
}
Die öffentliche Klasse DateConverter erweitert DefaultTypeConverter {
@Override public Object ConvertValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
versuchen {
if(toType == Date.class){//Wenn die Zeichenfolge in den Datumstyp konvertiert wird
String[] params = (String[]) value;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//When Date wird in einen String konvertiert
Datum date = (Datums-)Wert;
return dateFormat.format(date);
}
} Catch (ParseException e) {}
null zurückgeben;
}
}
Registrieren Sie den oben genannten Typkonverter als lokalen Typkonverter:
Platzieren Sie die Datei ActionClassName-conversion.properties unter dem Paket, in dem sich die Action-Klasse befindet, und die folgende Datei ist -conversion.properties. Für dieses Beispiel sollte der Name der Datei lauten HelloWorldAction-conversion.properties. Der Inhalt der Eigenschaftendatei ist:
Eigenschaftsname = Vollständiger Klassenname des Typkonverters. In diesem Beispiel lautet der Inhalt der Datei HelloWorldAction-conversion.properties:
createtime= cn.csdn.conversion.DateConverter
Registrieren Sie den obigen Typkonverter als globalen Typkonverter:
Platzieren Sie die Datei xwork-conversion.properties unter WEB-INF/classes. Der Inhalt der Eigenschaftendatei ist:
Der zu konvertierende Typ = der vollständig qualifizierte Klassenname des Typkonverters. In diesem Beispiel lautet der Inhalt der Datei xwork-conversion.properties:
java.util.Date= cn.csdn.conversion.DateConverter
Eigenschaften vom Typ java.util.Date können Anforderungsparameterwerte im Format 20.07.2009 empfangen. Wenn wir jedoch Anforderungsparameter im Format 20091221 empfangen müssen, müssen wir einen Typkonverter definieren, andernfalls kann struts2 die Typkonvertierung nicht automatisch abschließen.
import java.util.Date;
öffentliche Klasse HelloWorldAction {
privates Datum, Erstellungszeit;
öffentliches Datum getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
}
Die öffentliche Klasse DateConverter erweitert DefaultTypeConverter {
@Override public Object ConvertValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
versuchen {
if(toType == Date.class){//Wenn die Zeichenfolge in den Datumstyp konvertiert wird
String[] params = (String[]) value;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//When Date wird in einen String konvertiert
Datum date = (Datums-)Wert;
return dateFormat.format(date);
}
} Catch (ParseException e) {}
null zurückgeben;
}
}
Registrieren Sie den oben genannten Typkonverter als lokalen Typkonverter:
Platzieren Sie die Datei ActionClassName-conversion.properties unter dem Paket, in dem sich die Action-Klasse befindet, und die folgende Datei ist -conversion.properties. Für dieses Beispiel sollte der Name der Datei lauten HelloWorldAction-conversion.properties. Der Inhalt der Eigenschaftendatei ist:
Eigenschaftsname = Vollständiger Klassenname des Typkonverters. In diesem Beispiel lautet der Inhalt der Datei HelloWorldAction-conversion.properties:
createtime= cn.csdn.conversion.DateConverter
Registrieren Sie den obigen Typkonverter als globalen Typkonverter:
Platzieren Sie die Datei xwork-conversion.properties unter WEB-INF/classes. Der Inhalt der Eigenschaftendatei ist:
Der zu konvertierende Typ = der vollständig qualifizierte Klassenname des Typkonverters. In diesem Beispiel lautet der Inhalt der Datei xwork-conversion.properties:
java.util.Date= cn.csdnconversion.DateConverter