1. Signification de la conversion de type
Pour un framework MVC intelligent, il est inévitable d'implémenter une conversion de type. Étant donné que les paramètres de requête des applications de structure B/S (navigateur/serveur) sont envoyés au serveur via le navigateur, ces paramètres ne peuvent pas avoir de types de données riches, donc un type de données. la conversion doit être effectuée côté serveur
Le framework MVC est une solution de couche de présentation et devrait fournir une prise en charge de la conversion de type. Struts2 fournit une prise en charge très puissante de la conversion de type.
2. Traitement des données de la couche de présentation
1. Pour les applications Web, la couche de présentation est principalement utilisée pour interagir avec les utilisateurs, notamment en collectant les données saisies par les utilisateurs et en présentant l'état du serveur aux utilisateurs. Par conséquent, le flux de données dans la couche de présentation a principalement deux directions : les données d’entrée et les données de sortie.
2. Pour les données d'entrée : il est nécessaire de terminer la conversion des données de chaîne en plusieurs types de données. Le programme ne peut généralement pas être complété automatiquement et doit être converti manuellement dans le code.
3. Pour les données de sortie : Java et jsp prennent en charge la sortie directe de plusieurs types de données.
4. Un autre traitement de données dans la couche de présentation est : la vérification des données, qui est divisée en vérification client et vérification côté serveur. Cela sera expliqué en détail plus tard.
3. Conversion de types
1. Les paramètres HTTP sont tous des types de chaînes. Les données enregistrées peuvent être une chaîne, un nombre, un booléen, une date et une heure, etc. ou du type JavaBean. Conversion de type manuelle, telle que la conversion d'une chaîne en date, en : obtenant la chaîne via la méthode request.getParameter ; en vérifiant si elle est vide en convertissant la chaîne en un objet Date via la méthode DateFormat.parse ;
2. Conversion de type Struts2
Conversion de type intégrée Struts2
String et boolean complètent la conversion entre les valeurs string et booléennes
Conversion de chaînes et de caractères entre chaînes et caractères ordinaires
String, int et Integer terminent la conversion entre les chaînes et les entiers.
String et Long terminent la conversion entre les valeurs de chaîne et les valeurs entières longues
String, double et Double terminent la conversion des chaînes et des valeurs à virgule flottante double précision.
String et Float terminent la conversion entre les chaînes et la virgule flottante simple précision
String et Date terminent la conversion entre les types chaîne et date. Le format de date utilise le format SHORT de la langue dans laquelle l'utilisateur demande le format.
Chaîne et tableau Dans le cas par défaut, l'élément du tableau est une chaîne Si l'utilisateur définit un convertisseur de type, il peut également s'agir d'autres types de données composites.
Chaîne, carte et liste
Conversion de type intégrée Struts2
String et boolean complètent la conversion entre les valeurs string et booléennes
Conversion de chaînes et de caractères entre chaînes et caractères ordinaires
String, int et Integer terminent la conversion entre les chaînes et les entiers.
String et Long terminent la conversion entre les valeurs de chaîne et les valeurs entières longues
String, double et Double terminent la conversion des chaînes et des valeurs à virgule flottante double précision.
String et Float terminent la conversion entre les chaînes et la virgule flottante simple précision
String et Date terminent la conversion entre les types chaîne et date. Le format de date utilise le format SHORT de la langue dans laquelle l'utilisateur demande le format.
Chaîne et tableau Dans le cas par défaut, l'élément du tableau est une chaîne Si l'utilisateur définit un convertisseur de type, il peut également s'agir d'autres types de données composites.
Chaîne, carte et liste
3. Conversion de type intégrée
4. API de conversion de type Struts
Le convertisseur de type de Struts2 est en fait implémenté sur la base d'OGNL. Il existe une interface ognl.TypeConverter dans le projet OGNL. Cette interface est l'interface qui doit être implémentée pour implémenter le convertisseur de type. L'interface est définie comme suit :
Interface publique TypeConverter {
Objet public convertValue (Map arg0, Objet arg1, Membre arg2, Chaîne arg3,
Objet arg4, classe arg5) {
renvoie null ;
}
Pour implémenter un convertisseur de type, vous devez implémenter le TypeConverter ci-dessus. Cependant, les méthodes de l'interface ci-dessus sont trop compliquées, le projet OGNL fournit également une classe d'implémentation de cette interface : ognl.DefaultTypeConverter. héritant de cette classe. La classe est définie comme suit :
la classe publique DefaultTypeConverter étend l'objet implémente TypeConverter{
public Object convertValue(Map<String,Object>context, Objectvalue, ClasstoType) {
}
……//Autres méthodes
}
Le rôle de la méthode ConvertValue est d'effectuer la conversion de type, mais cette conversion de type est bidirectionnelle. Lorsqu'une chaîne doit être convertie en instance d'objet, cette méthode est également utilisée. utilisé. Cette conversion s'effectue via le type de paramètre toType qui est le type cible qui doit être converti. Par conséquent, le sens de conversion peut être déterminé en fonction du paramètre toType.
Paramètres de la méthode ConvertValue et signification du retour Le premier paramètre : le contexte est le contexte de l'environnement de conversion de type. Le deuxième paramètre : la valeur est le paramètre qui doit être converti. La valeur du paramètre value est également différente selon le sens de la conversion.
Le troisième paramètre : toType est le type cible converti. La valeur de retour de cette méthode est la valeur après la conversion de type. Le type de valeur change également avec le sens de la conversion. On peut voir que la méthode convertValue convertie accepte la valeur qui doit être convertie, le type cible qui doit être converti est un paramètre, puis renvoie la valeur cible convertie.
Pourquoi Value est-il un tableau de chaînes ?
Pour le convertisseur DefaultTypeConverter, il doit prendre en compte la situation la plus courante, il traite donc tous les paramètres de requête comme des tableaux de chaînes au lieu de chaînes. Équivalent aux valeurs des paramètres obtenues par getParameterValues()
4. Implémentation du convertisseur de type
1. Page d'inscription de la première étape
2. La deuxième étape : implémenter la classe d'encapsulation User
3. La troisième étape : implémenter la classe Action
5. Étape 5 : Enregistrez le convertisseur de type. Il existe trois méthodes d'enregistrement :
1. Enregistrez un convertisseur de type local : le convertisseur de type local ne fonctionne que sur les propriétés d'une certaine action
2. Enregistrez un convertisseur de type global : le convertisseur de type global prendra effet sur tous les attributs spécifiques de l'action.
3. Utilisez les annotations JDK1.5 pour enregistrer le convertisseur de type : générez le convertisseur de type via l'enregistrement.
6. Format de nom de fichier d'enregistrement d'enregistrement de convertisseur de type partiel : ActionName-conversion.properties : ActionName est le nom de classe de l'action qui nécessite que le convertisseur prenne effet, et la chaîne -conversion.properties suivante est un fichier de propriétés typique lors de la correction d'une partie ou plus du fichier. Il se compose de paires clé-valeur. Le contenu du fichier est : propertyName = type converter class. Voici le contenu du fichier UserAction-conversion.properties :
#Spécifiez que l'attribut utilisateur dans UserAction doit utiliser la classe redarmy.user.UserConverter pour terminer la conversion de type
user=redarmy.user.UserConverter
Remarque : le fichier de propriétés ci-dessus doit être dans le même package que UserAction. Autrement dit, dans le cas ci-dessus, la méthode ci-dessus peut être utilisée pour réaliser une conversion de type locale.
7. Le format de fichier du nom d'enregistrement du convertisseur de type global : fichier xwork-conversion.properties. Ce fichier est également un fichier de propriétés et son contenu est également composé de l'élément "type composite = classe de convertisseur de type correspondante".
Voici le contenu du fichier xwork-conversion.properties :
#Spécifiez le convertisseur de type de toutes les classes redarmy.user.User comme redarmy.user.UserConverter
redarmy.user.User=redarmy.user.UserConverter
Remarque : Le fichier xwork-conversion.properties doit être créé sous le dossier class, c'est-à-dire sous src.
5. Conversion de type personnalisé Struts2
La classe StrutsTypeConverter est fournie dans Struts2 pour simplifier la conception de la conversion de type personnalisée. Cette classe dispose de deux méthodes abstraites qui doivent être implémentées :
(1) objet public convertFromString (contexte de la carte, valeurs String[], classe vers classe) ;
Paramètres de la méthode de traitement utilisés pour convertir les données de type String en types personnalisés :
contexte --- informations contextuelles liées à l'action
valeurs --- valeurs des paramètres obtenues à partir de la requête
toClass --- le type cible à convertir
(2) public String convertToString (contexte de la carte, objet obj);
Utilisé pour convertir les types personnalisés en chaîne
paramètre:
contexte --- informations contextuelles liées à l'action
obj --- objet de type personnalisé
Exemple d'analyse : conception et configuration d'une conversion de type de date
(1) Concevez MyDateTypeConverter, héritez de StrutsTypeConverter et couvrez deux de ses méthodes. Le code de référence est le suivant :
public Object convertFromString (contexte de la carte, valeurs String [], classe vers classe) {
SimpleDateFormat sdf = new SimpleDateFormat("aaaa-MM-jj");
essayer{
Date v = sdf.parse(values[0]);
retourner v ;
}attraper(Exception e){
e.printStackTrace();
renvoie une nouvelle date ();
}
}
Suite
public String convertToString (contexte de la carte, objet obj) {
SimpleDateFormat sdf = new SimpleDateFormat("aaaa année MM mois jj jour");
Date v = (Date)obj ;
retourner sdf.format(v);
}
Bien que Struts2 prenne en charge la conversion de chaîne et de date par défaut, il ne prend en charge que la conversion de format court et de format de date localisé, ce qui peut ne pas répondre à vos besoins. Nous devons implémenter notre propre conversion de type.
(2) Ajoutez un attribut d'anniversaire à la classe UserInfo, dont le type est java.util.Date
classe publique UserInfo {
Identifiant entier privé ;
nom de chaîne privé ;
mot de passe de chaîne privée ;
Date d'anniversaire privée ;
...
}
(3) Configurez le convertisseur de type pour le composant UserInfo. Commencez par créer un fichier de propriétés basé sur le nom de classe du composant UserInfo. Le format de nom de fichier est class name-conversion.properties.
Par exemple UserInfo-conversion.properties
Ce fichier doit être dans le même package que le composant UserInfo.
Le format du contenu de ce fichier de fonctionnalités est le suivant :
anniversaire = demo.converter.MyDateTypeConverter
illustrer:
anniversaire est le nom d'attribut du type java.util.Date dans le composant UserInfo
demo.converter.MyDateTypeConverter est une classe d'implémentation de conversion personnalisée
Le framework Strus2 en tient compte et fournit un moyen simple de le gérer.
Pour configurer le convertisseur de type au niveau global, il suffit d'écrire un fichier de propriétés nommé xwork-conversion.properties, qui doit se trouver dans le répertoire /WEB-INF/classes, avec le contenu suivant :
java.util.Date=demo.converter.MyDateTypeConverter
6. Convertisseur de type personnalisé
Les propriétés de type java.util.Date peuvent recevoir des valeurs de paramètres de requête au format 2009-07-20. Mais si nous devons recevoir les paramètres de la requête au format 20091221, nous devons définir un convertisseur de type, sinon struts2 ne pourra pas terminer automatiquement la conversion de type.
importer java.util.Date ;
classe publique HelloWorldAction {
date privée, heure de création ;
date publique getCreatetime() {
retourner le temps de création ;
}
public void setCreatetime (Date heure de création) {
this.createtime = createtime;
}
}
la classe publique DateConverter étend DefaultTypeConverter {
@Override public Object convertValue (contexte de la carte, valeur de l'objet, classe toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("aaaaMMjj");
essayer {
if(toType == Date.class){//Lorsque la chaîne est convertie en type Date
String[] params = (String[]) valeur ; // Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//Quand la date est convertie en chaîne
Date date = valeur (Date) ;
return dateFormat.format(date);
}
} catch (ParseException e) {}
renvoie null ;
}
}
Enregistrez le convertisseur de type ci-dessus en tant que convertisseur de type local :
Placez le fichier ActionClassName-conversion.properties sous le package où se trouve la classe Action. ActionClassName est le nom de classe d'Action, et le -conversion.properties suivant est une méthode d'écriture fixe. Pour cet exemple, le nom du fichier doit être. HelloWorldAction-conversion.properties. Le contenu du fichier de propriétés est :
Nom de la propriété = Nom complet de la classe du convertisseur de type. Pour cet exemple, le contenu du fichier HelloWorldAction-conversion.properties est :
createtime = cn.csdn.conversion.DateConverter
Enregistrez le convertisseur de type ci-dessus en tant que convertisseur de type global :
Placez le fichier xwork-conversion.properties sous WEB-INF/classes. Le contenu du fichier de propriétés est :
Le type à convertir = le nom de classe complet du convertisseur de type. Pour cet exemple, le contenu du fichier xwork-conversion.properties est :
java.util.Date = cn.csdn.conversion.DateConverter
Les propriétés de type java.util.Date peuvent recevoir des valeurs de paramètres de requête au format 2009-07-20. Mais si nous devons recevoir les paramètres de la requête au format 20091221, nous devons définir un convertisseur de type, sinon struts2 ne pourra pas terminer automatiquement la conversion de type.
importer java.util.Date ;
classe publique HelloWorldAction {
date privée, heure de création ;
date publique getCreatetime() {
retourner le temps de création ;
}
public void setCreatetime (Date heure de création) {
this.createtime = createtime;
}
}
la classe publique DateConverter étend DefaultTypeConverter {
@Override public Object convertValue (contexte de la carte, valeur de l'objet, classe toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("aaaaMMjj");
essayer {
if(toType == Date.class){//Lorsque la chaîne est convertie en type Date
String[] params = (String[]) valeur ; // Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//Quand la date est convertie en chaîne
Date date = valeur (Date) ;
return dateFormat.format(date);
}
} catch (ParseException e) {}
renvoie null ;
}
}
Enregistrez le convertisseur de type ci-dessus en tant que convertisseur de type local :
Placez le fichier ActionClassName-conversion.properties sous le package où se trouve la classe Action. ActionClassName est le nom de classe d'Action, et le -conversion.properties suivant est une méthode d'écriture fixe. Pour cet exemple, le nom du fichier doit être. HelloWorldAction-conversion.properties. Le contenu du fichier de propriétés est :
Nom de la propriété = Nom complet de la classe du convertisseur de type. Pour cet exemple, le contenu du fichier HelloWorldAction-conversion.properties est :
createtime = cn.csdn.conversion.DateConverter
Enregistrez le convertisseur de type ci-dessus en tant que convertisseur de type global :
Placez le fichier xwork-conversion.properties sous WEB-INF/classes. Le contenu du fichier de propriétés est :
Le type à convertir = le nom de classe complet du convertisseur de type. Pour cet exemple, le contenu du fichier xwork-conversion.properties est :
java.util.Date = cn.csdnconversion.DateConverter