1. Diverses valeurs par défaut dans la configuration de l'action
<package name="csdn" namespace="/test" extends="struts-default">
<action name="helloworld" method="execute" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</paquet>
1>Si aucune classe n'est spécifiée pour l'action, la valeur par défaut est ActionSupport.
2>Si aucune méthode n'est spécifiée pour l'action, la méthodeexecute() dans l'action sera exécutée par défaut.
3>Si l'attribut name du résultat n'est pas spécifié, la valeur par défaut est succès.
2. Différents types de transfert de résultats en action
<nom de l'action="helloworld">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
La configuration des résultats est similaire à forward dans struts1, mais struts2 fournit plusieurs types de résultats. Les types couramment utilisés sont : dispatcher (valeur par défaut), redirect, redirectAction, plainText.
Voici un exemple du type de résultat redirectAction, si l'action redirigée se trouve dans le même package :
<result type="redirectAction">helloworld</result>
Si l'action redirigée se trouve dans un autre espace de noms :
<result type="redirectAction">
<param name="actionName">bonjour le monde</param>
<param name="namespace">/test</param>
</résultat>
texte brut : affiche le contenu du fichier d'origine. Par exemple, lorsque nous devons afficher le code source du fichier jsp tel quel, nous pouvons utiliser ce type.
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- Spécifiez l'encodage pour la lecture des fichiers -->
</résultat>
Dans le résultat, vous pouvez également utiliser l'expression ${attribute name} pour accéder aux attributs de l'action. Les noms d'attribut dans l'expression correspondent aux attributs de l'action. comme suit:
<result type="redirect">view.jsp?id=${id}</result>
3. Plusieurs actions partagent une seule vue - configuration globale des résultats
Lorsque la même vue est utilisée dans plusieurs actions, nous devons définir le résultat comme une vue globale. L'avance globale est fournie dans struts1, et des fonctions similaires sont également fournies dans struts2 :
<paquet....>
<résultats-globaux>
<result name="message">/message.jsp</result>
</résultats-globaux>
</paquet>
4. Injecter des valeurs dans les propriétés de l'action
Struts2 fournit une fonction d'injection de dépendances pour les propriétés d'Action. Dans le fichier de configuration struts2, nous pouvons facilement injecter des valeurs dans les propriétés d'Action. Remarque : Les propriétés doivent fournir des méthodes de définition.
classe publique HelloWorldAction{
chaîne privée savePath ;
chaîne publique getSavePath() {
retourner savePath ;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
...
}
<package name="csdn" namespace="/test" extends="struts-default">
<nom de l'action="helloworld" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</paquet>
Ce qui précède injecte "/images" dans l'attribut savePath de l'action via le nœud <param>.
5. Spécifiez le suffixe de la demande qui doit être traité par Struts 2
Auparavant, nous utilisions le suffixe .action par défaut pour accéder à Action. En fait, le suffixe par défaut peut être modifié via la constante "struts.action.extension". Par exemple, nous pouvons configurer Struts 2 pour traiter uniquement les chemins de requêtes avec .do comme suffixe :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE se pavane en PUBLIC
"-//Apache Software Foundation//Configuration DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<entretoises>
<constant name="struts.action.extension" value="do"/>
</struts>
Si l'utilisateur doit spécifier plusieurs suffixes de requête, séparez-les par des virgules (,). comme:
<constant name="struts.action.extension" value="do,go"/>
6. Décrire en détail la définition des constantes
Les constantes peuvent être configurées dans struts.xml ou struts.properties. Il est recommandé de les configurer dans struts.xml. Les deux méthodes de configuration sont les suivantes :
Configurer les constantes dans le fichier struts.xml
<entretoises>
<constant name="struts.action.extension" value="do"/>
</struts>
Configurer les constantes dans struts.properties
struts.action.extension=faire
Étant donné que les constantes peuvent être définies dans plusieurs fichiers de configuration ci-dessous, nous devons comprendre l'ordre de recherche dans lequel struts2 charge les constantes :
struts-default.xml
struts-plugin.xml
struts.xml
struts.propriétés
web.xml
Si la même constante est configurée dans plusieurs fichiers, la valeur constante configurée dans ce dernier fichier écrasera la valeur constante configurée dans le fichier précédent.
7. Introduction aux constantes couramment utilisées
<!-- Spécifiez le jeu d'encodage par défaut, qui agit sur la méthode setCharacterEncoding de HttpServletRequest et la sortie de freemarker et de vélocité -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- Cet attribut spécifie le suffixe de requête qui doit être traité par Struts 2. La valeur par défaut de cet attribut est action, c'est-à-dire que toutes les requêtes correspondant à *.action sont traitées par Struts2.
Si l'utilisateur doit spécifier plusieurs suffixes de requête, séparez-les par des virgules (,). -->
<constant name="struts.action.extension" value="do"/>
<!-- Définissez si le navigateur met en cache le contenu statique. La valeur par défaut est true (utilisée dans l'environnement de production). Il est préférable de la désactiver pendant la phase de développement.
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- Lorsque le fichier de configuration Struts est modifié, que le système recharge automatiquement le fichier, la valeur par défaut est false (utilisée dans l'environnement de production), il est préférable de l'activer pendant la phase de développement -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- Utilisé en mode développement, pour pouvoir imprimer des messages d'erreur plus détaillés -->
<constant name="struts.devMode" value="true" />
<!--Thème d'affichage par défaut-->
<constant name="struts.ui.theme" value="simple" />
<! Lors de l'intégration avec Spring, précisez que Spring est responsable de la création de l'objet action -->
<constant name="struts.objectFactory" value="spring" />
<!Cette propriété définit si Struts 2 prend en charge les appels de méthodes dynamiques. La valeur par défaut de cette propriété est true. Si vous devez désactiver l’appel de méthode dynamique, vous pouvez définir cette propriété sur false. -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!--Taille limite pour les fichiers téléchargés-->
<constant name="struts.multipart.maxSize" value="10701096"/>
8. Spécifiez plusieurs fichiers de configuration Struts pour l'application
Dans la plupart des applications, à mesure que l'échelle de l'application augmente, le nombre d'actions dans le système augmentera également de manière significative, ce qui entraînera une surcharge du fichier de configuration struts.xml. Afin d'éviter que le fichier struts.xml ne soit trop volumineux et trop volumineux et d'améliorer la lisibilité du fichier struts.xml, nous pouvons décomposer un fichier de configuration struts.xml en plusieurs fichiers de configuration, puis inclure d'autres fichiers de configuration dans le fichier struts.xml. déposer. Le fichier struts.xml suivant spécifie plusieurs fichiers de configuration via l'élément <include> :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE se pavane en PUBLIC
"-//Apache Software Foundation//Configuration DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<entretoises>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>
De cette façon, nous pouvons ajouter Struts 2 Action à plusieurs fichiers de configuration par module.
9. Appel de méthode dynamique
S'il y a plusieurs méthodes dans l'action, nous pouvons utiliser !+nom de la méthode pour appeler la méthode spécifiée. comme suit:
classe publique HelloWorldAction{
message de chaîne privé ;
....
public Stringexecute() lève une exception{
this.message = "Ma première application struts2";
renvoyer « succès » ;
}
public String other() lève une exception{
this.message = "Deuxième méthode";
renvoyer « succès » ;
}
}
Supposons que le chemin URL pour accéder à l'action ci-dessus est : /struts/test/helloworld.action
Pour accéder à la méthode other() de l'action, nous pouvons l'appeler ainsi :
/struts/test/helloworld!other.action
Si nous ne souhaitons pas utiliser l'invocation de méthode dynamique, nous pouvons désactiver l'invocation de méthode dynamique via la constante struts.enable.DynamicMethodInvocation.
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
10. Utilisez des caractères génériques pour définir des actions
<package name="csdn" namespace="/test" extends="struts-default">
<action name="helloworld_*" méthode="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</paquet>
classe publique HelloWorldAction{
message de chaîne privé ;
....
public Stringexecute() lève une exception{
this.message = "Ma première application struts2";
renvoyer « succès » ;
}
public String other() lève une exception{
this.message = "Deuxième méthode";
renvoyer « succès » ;
}
}
Pour accéder à la méthode other(), vous pouvez y accéder via une URL comme celle-ci : /test/helloworld_other.action
11. Recevoir les paramètres de la demande
Utiliser des types de base pour recevoir les paramètres de requête (get/post)
Définissez un attribut avec le même nom que le paramètre de requête dans la classe Action, et struts2 peut automatiquement recevoir le paramètre de requête et l'attribuer à l'attribut du même nom.
Chemin de requête : http://localhost:8080/test/view.action?id=78
classe publique ProductAction {
Identifiant entier privé ;
public void setId(Integer id) {//struts2 utilise la technologie de réflexion pour appeler la méthode setter de la propriété portant le même nom que le paramètre de requête afin d'obtenir la valeur du paramètre de requête
this.id = identifiant;
}
public Integer getId() {identifiant de retour ;}
}
Utilisez le type composite pour recevoir le chemin de requête des paramètres de requête : http://localhost:8080/test/view.action?product.id=78
classe publique ProductAction {
produit produit privé ;
public void setProduct (Produit produit) { this.product = produit }
produit public getProduct() {produit de retour ;}
}
Struts2 crée d'abord l'objet produit en appelant le constructeur par défaut de Product via la technologie de réflexion, puis appelle la méthode setter de la propriété avec le même nom que le paramètre de requête dans product via la technologie de réflexion pour obtenir la valeur du paramètre de requête.
12. La 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.
13. Traitement des données de la couche présentation
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.
Pour les données d'entrée : vous devez 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.
Pour les données de sortie : Java et jsp prennent en charge la sortie directe de plusieurs types de données.
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.
14. Conversion de types
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 ;
15. 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
16. API de conversion de type de jambe de force
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 (contexte Map<String,Object>, valeur de l'objet, classe toType) {
}
……//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()