Préface
Pourquoi taper le convertisseur dans Struts2?
: Struts2 ne peut fournir une conversion automatique que pour 8 types d'origine en Java et des types communs tels que la chaîne et la date.
Mais cela ne peut certainement pas répondre à nos besoins si nous voulons intégrer les données de la page dans un Javabean. Lorsque vous allez à l'action, ce que l'action obtient un objet, donc cette exigence nous oblige à utiliser un convertisseur de type.
La plupart du temps, en utilisant le convertisseur de type intégré et le convertisseur de type basé sur OGNL fourni par le cadre Struts2 peuvent répondre à la plupart des besoins de conversion de type; Cependant, il existe des cas spéciaux où une chaîne d'un format spécifié peut devoir être convertie en un objet composite, et un convertisseur de type personnalisé est requis. Par exemple, si le client envoie une chaîne comme "Jelly | 123456" au serveur, nous devons convertir cette chaîne en instance de type utilisateur, avec "Jelly" comme nom d'utilisateur et "123456" comme mot de passe utilisateur.
Classe de conversion de type personnalisé
Il y a une page de réception comme ceci:
<form action = "login" méthode = "post"> utilisateur: <input type = "text" name = "userInfo"> <br> <input type = "soume" value = "convert"> </ form>
Le code d'action correspondant est:
utilisateur utilisateur privé; // Ceci est une pointe de chaîne privée de type composé; SetUsers publics public (utilisateur utilisateur) {this.user = utilisateur;} public utilisateur getUser () {return user;}Nous espérons que l'utilisateur entre dans une chaîne de la page de premier plan avec le format "nom d'utilisateur | mot de passe" et convertit la chaîne au format "Nom d'utilisateur | mot de passe" en type d'utilisateur via un convertisseur de type personnalisé. Parlons de la façon d'implémenter un convertisseur de type personnalisé.
Le convertisseur de type de Struts2 est en fait toujours basé sur le cadre OGNL. Il existe une interface TypeConverter dans le projet OGNL, qui est l'interface qui doit être implémentée par un convertisseur de type personnalisé. Le code de définition de cette interface est le suivant:
// OGNL fournit l'interface publique TypeConverter {public Object ConvertValue (Contexte de carte, cible d'objet, membre membre, nom de chaîne, valeur d'objet, classe toty);}Pour implémenter un convertisseur de type, vous devez implémenter le typonverter ci-dessus, mais les méthodes de l'interface ci-dessus sont trop complexes, de sorte que le projet OGNL fournit également une classe d'implémentation pour cette interface: DefaultTypeConverter, qui utilise généralement une étendue de cette classe pour implémenter des convertisseurs de type personnalisés. L'implémentation d'un convertisseur de type personnalisé nécessite la remplacement de la méthode ConvertValue de la classe de défaut de typeConverteur.
Ce qui suit est la classe de conversion convertie en instance de classe utilisateur:
La classe publique UserConverter étend defaultTypeConverter {public Object ConvertValue (Context Map, Valeur d'objet, classe TOTYPE) {if (totype == user.class) {// Lorsque vous devez convertir une chaîne en valeur d'utilisateur // Le paramètre de demande du système est une chaîne de chaîne String [] params = (string []); // Créer une instance utilisateur utilisateur utilisateur = new user (); // ne traite que le premier élément de tableau du tableau de paramètres de demande et divisez la chaîne en deux chaînes avec le '|' String de symbole [] userValues = params [0] .split ("// |"); // attribue une valeur à l'instance utilisateur user.setName (userValues [0]); user.setpassword (userValues [1]); RETOUR UTILISATEUR; } else if (totype == string.class) {// Lorsqu'il est nécessaire de convertir le type d'utilisateur en une valeur utilisateur utilisateur de chaîne = (utilisateur); return "<" + user.getName () + "|" + user.getPassword () + ">"; } return null; }}La fonction de la méthode ConvertValue est très simple. Cette méthode est chargée de terminer la conversion de type, mais cette conversion est bidirectionnelle. Le type cible est jugé en fonction du paramètre TOTYPE, puis nous pouvons implémenter la logique de conversion dans deux directions.
Enregistrer un convertisseur de type
Avoir un convertisseur de type ne suffit pas, car le cadre Struts2 ne sait pas quand utiliser ces convertisseurs de type, de sorte que le convertisseur de type doit être enregistré dans l'application Web, de sorte que le cadre Struts2 peut utiliser ce convertisseur de type normalement.
Struts2 prend principalement en charge les deux façons suivantes d'enregistrer les convertisseurs de type:
Parlons des deux méthodes ci-dessus pour enregistrer les convertisseurs de type.
Convertisseur de type local
Struts2 permet aux développeurs de spécifier des informations de configuration pour la conversion de type via des fichiers de conversion de type local. Un fichier de conversion de type est un fichier de propriétés ordinaires (* .properties). Le nom de fichier du fichier de conversion de type local doit être dans le formulaire ActionName-Conversion.Properties, où ActionName est le nom d'action qui doit être converti en fichier avec ce type, et la chaîne suivante -Conversion.properties est une pièce fixe. Le fichier de conversion de type doit être placé au même emplacement que le fichier de classe d'action.
Après avoir parlé du fichier de conversion de type local, continuons à parler du convertisseur de type local enregistré. Pour enregistrer un convertisseur de type local, il vous suffit d'ajouter la ligne de configuration suivante au fichier de convertisseur de type local:
<propName> = <ConverterClass>
Remplacez le <propName ci-dessus par la propriété qui doit être converti de type et remplacez <fracverterClass> par la classe d'implémentation du convertisseur de type. Pour la classe UserConverter implémentée ci-dessus, il est nécessaire de le configurer dans le fichier de conversion de type local comme suit:
# Pour spécifier l'attribut utilisateur, vous devez utiliser la classe UserConverter pour compléter la conversion de type utilisateur = com.jellythink.practise.userConverter
Convertisseur de type global
Les limites des convertisseurs de type local sont trop évidentes et ne peuvent fonctionner que sur des actions spécifiées et des propriétés spécifiées. Cependant, si plusieurs actions dans l'application contiennent des attributs du type d'utilisateur ou qu'une action contient des attributs de type d'utilisateur multiple, il serait plus approprié d'utiliser un convertisseur de type global.
Le convertisseur de type global ne fonctionne pas sur les propriétés spécifiées de l'action spécifiée, mais sur le type spécifié. Par exemple, cela fonctionne pour toutes les propriétés du type com.jellythink.practise.user.
L'enregistrement d'un convertisseur de type global doit fournir un fichier XWork-Conversion.Properties, qui est le fichier de convertisseur de type global. Vous devez placer directement le fichier sous le chemin Web-inff / classes de l'application Web.
Le contenu de fichier de conversion de type global se compose d'éléments multiples <propype> = <convertins>. Remplacez Propype par le type qui doit être converti de type et remplacez ConvertClass par la classe d'implémentation du convertisseur de type. Pour la classe UserConverter implémentée ci-dessus, il est nécessaire de le configurer dans le fichier de conversion de type global comme suit:
com.jellythink.practise.user = com.jellythink.practise.userConverter
"Local" vs "global"
La conversion de type local ne peut convertir que l'attribut spécifié de l'action spécifiée. Peu importe que l'attribut de l'action soit un tableau ou un type de collection, la méthode de conversion du convertisseur ne convertit que l'attribut une fois. Si une action a un utilisateur de la propriété LIST <utilisateur, le convertisseur de type local n'appellera la méthode convertvalue () qu'une seule fois, qui convertit le paramètre de la demande des utilisateurs en un objet de collection Liste <User> en même temps.
Le convertisseur de type global convertira tous les types spécifiques à l'action. Si l'attribut d'une action est un type de tableau ou de collecte, et que l'élément de tableau ou de collecte est la méthode qui nécessite le convertisseur à convertir, le convertisseur de type global ne convertira pas l'attribut SET entier, mais convertira chaque élément de l'attribut SET. Autrement dit, lorsque l'attribut est un tableau ou une collection, le tableau ou la collection contient plusieurs éléments du type, alors la méthode ConvertValue () sera appelée plusieurs fois.
Après s'être familiarisé avec la différence entre les deux, j'y prêterai plus d'attention dans mon travail futur; Surtout la différence entre les éléments du tableau et définissent lors de leur convertissement.
Convertisseur de type personnalisé basé sur Struts2
Ce qui précède introduit la direction de conversion en héritant de la classe de DefaultTypeConverter, dans une méthode ConvertValue, la direction de conversion est jugée en jugeant le paramètre Totype, puis la logique de conversion pour différentes directions de conversion est implémentée séparément. Dans le cadre Struts2, afin de simplifier l'implémentation de convertisseurs de type, une classe abstraite de StrutstyPeConverter est spécialement fournie, qui est une sous-classe de la classe de défaut de TypeConverter. Il a implémenté la méthode ConvertValue de la classe de DefaultTypeConverter; Lors de la mise en œuvre de cette méthode, il transforme la conversion dans deux directions différentes en jugeant le paramètre Totype dans la méthode ConvertValue en appelant les deux méthodes différentes suivantes:
Ce que nous devons faire, c'est hériter de la classe abstraite de StrutstyPeConverter et implémenter les deux méthodes abstraites: convertfromstring et convertToString.
Le code modifié est le suivant:
La classe publique UserConverter étend StrutSypeConverter {public Object ConvertFromString (Map Context, String [] Values, class toClass) {user user = new User (); String [] uservalues = valeurs [0] .split ("// |"); user.setName (userValues [0]); user.setpassword (userValues [1]); RETOUR UTILISATEUR; } public String ConvertToString (Map Context, Object O) {// Lorsqu'il est nécessaire de convertir le type d'utilisateur en un utilisateur utilisateur de chaîne = (utilisateur) o; return "<" + user.getName () + "|" + user.getPassword () + ">"; }}Résumer
Cet article résume en détail le convertisseur de type personnalisé dans Struts2, et l'idée globale est la suivante:
Quelques étapes pour faire le convertisseur de type personnalisé.
D'accord, ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.