|
||
![]() |
|
![]() |
|
Table of Contents
Gestion des modes d'affichage avec Struts-LayoutUne application Web est souvent constituée de plusieurs écrans contenant chacun un formulaire. Il est courant d’avoir besoin de manipuler le mode d’affichage des champs de ces formulaires : ces champs peuvent par exemple tantôt être éditables tantôt non éditables, en fonction des actions effectuées par l’utilisateur. L’objectif de cet article est de récapituler les principes d’utilisation des outils proposés par Struts-Layout permettant de gérer ces modes d’affichage. Principes générauxNotons avant tout qu’on distingue deux types de modes d’affichage pour un formulaire donné :
Mode d’affichage d’un champChaque champ d’un formulaire possède un mode d’affichage : par exemple, une zone de saisie de texte peut-être en mode édition ou en mode lecture seule. Il y a 8 modes d’affichage possibles :
Il est possible de changer le mode d’affichage d’un champ particulier, de plusieurs manières qui sont présentées dans la suite de cet article. Mode d’affichage d’un formulaireLa notion de mode d’affichage des formulaires permet de spécifier si le formulaire doit être affiché avec l’optique de créer, modifier ou consulter des informations. Ainsi, cette notion permet de définir le mode d’affichage des champs d’un formulaire en fonction du mode d’affichage de ce formulaire. Un formulaire peut prendre 3 modes d’affichage :
Mode d’affichage d’un champDans cette partie nous présentons les différentes façons de manipuler le mode d’affichage d’un champ particulier d’un formulaire. Contrôle statiqueUn formulaire est composé de champs de saisie dont on peut indiquer le mode d’affichage par défaut pour chaque mode d’affichage du formulaire (via l’attribut mode) : <layout:form> <layout:text property="login" mode="E,E,R" /> </layout:form> Dans l’exemple ci-dessus, le champ login sera par défaut éditable si le formulaire est en mode CREATE ou EDIT, mais sera en lecture seule si le formulaire est en mode INSPECT. En effet, d’une manière générale, le format de l’attribut mode d’un champ est : X,Y,Z, où :
Il s’agit là d’un moyen simple pour contrôler le mode d’affichage des formulaires et de leurs champs. Mais il s’agit là d’un moyen statique, qui ne permet donc pas de changer le mode d’affichage du champ en fonction de certains critères (droits d’accès de l’utilisateur par exemple). Contrôle dynamiqueIl est également possible de changer dynamiquement le mode d’affichage d’un champ, depuis une action Struts par exemple.
Il suffit d’appeler la méthode Notons que cette méthode stocke le mode d’affichage du champ au niveau de la session. Mode d’affichage d’un formulaireDans cette partie nous présentons les différentes façons de manipuler le mode d’affichage d’un formulaire. Contrôle dynamique
Il suffit d’appeler la méthode Notons que cette méthode stocke le mode d’affichage du formulaire au niveau de la session. Lien entre mode d'affichage d'un formulaire et mode d'affichage de ses champsPrésentons désormais comment mettre en oeuvre une politique fine des modes d’affichage.
Lors de l’affichage d’un tag Prenons un exemple classique. On souhaite mettre en oeuvre la politique d’affichage suivante :
Pour ce faire, on procède en deux étapes. 1. Implémentation d'un formulaire commun personnalisé
Tous les formulaires Struts étendent la classe
Au lieu de faire hériter directement de cette classe tous nos formulaires, faisons-les hériter d’une classe qu’on nommera Cette classe doit :
En voici la forme : public class MyForm extends ActionForm { protected static final short MODE_DEFAULT = -1; protected static final short MODE_EDIT = AbstractModeFieldTag.MODE_EDIT; protected static final short MODE_HIDDEN = AbstractModeFieldTag.MODE_HIDDEN; protected static final short MODE_INSPECT = AbstractModeFieldTag.MODE_INSPECT; protected static final short MODE_READONLY = AbstractModeFieldTag.MODE_READONLY; protected static final short MODE_DISABLED = AbstractModeFieldTag.MODE_DISABLED; protected static final short MODE_NODISPLAY = AbstractModeFieldTag.MODE_NODISPLAY; public short getFieldDisplayMode(String in_fieldName) { return MODE_DEFAULT; } }
Prenons comme exemple un formulaire nommé public class MyLoginForm extends MyForm { protected String login; public String getLogin() { return this.login; } public String setLogin(String in_login) { this.login = in_login; } public short getFieldDisplayMode(String in_fieldName) { if ("login".equals(in_fieldName)) { return MODE_HIDDEN; } return super.getFieldDisplayMode(in_fieldName); } } Autre exemple, où le champ “login” doit être éditable si un certain champ “topLogin” vaut true et doit être non éditable sinon : public class MyLoginForm2 extends MyForm { protected String login; public String getLogin() { return this.login; } public String setLogin(String in_login) { this.login = in_login; } public short getFieldDisplayMode(String in_fieldName) { if ("login".equals(in_fieldName)) { if (topLogin) { return MODE_EDIT; } else { return MODE_READONLY; } } return super.getFieldDisplayMode(in_fieldName); } } 2. Implémentation d'un FormUtils personnalisé
Il s’agit d’écrire une classe, qu’on nommera
formutils.class = fr.test.MyFormUtils
Il reste donc à implémenter la méthode public class MyFormUtils extends BasicFormUtils { public Integer getFieldDisplayMode(PageContext in_pageContext, String in_fieldName) { // Récupération du formulaire Object lc_object = in_pageContext.findAttribute(Constants.BEAN_KEY); MyForm lc_form = (MyForm) lc_object; // Récupération du mode d'affichage du formulaire int lc_formMode = FormUtils.getFormDisplayMode(in_pageContext); if (lc_formMode == FormUtils.CREATE_MODE || lc_formMode == FormUtils.EDIT_MODE) { // Récupération du mode d'affichage du champ short lc_fieldMode = lc_form.getFieldDisplayMode(in_fieldName); if (lc_fieldMode == MyForm.MODE_DEFAULT) { return super.getFieldDisplayMode(in_pageContext, in_fieldName); } else { return new Integer(lc_fieldMode); } } else { // if (lc_formMode == FormUtils.INSPECT_MODE) { return new Integer(MyForm.MODE_INSPECT); } } }
On notera que par défaut, si on ne crée pas de classe comme Cas particuliers et policiesLe moyen présenté dans la partie précédente permet de contrôler assez facilement le mode d’affichage d’un champ du formulaire de manière dynamique.
Lors de leur interprétation, la plupart des tags de champs de saisie interrogent la méthode
Cependant, il existe des tags qui n’appellent pas cette méthode : le tag
Pour ce faire, il suffit de renseigner l’attribut policy du tag en lui donnant le nom d’une politique d’affichage que l’on va définir dans la méthode
policy.class = fr.test.MyPolicy Si l’attribut policy est renseigné, cette méthode sera automatiquement appelée lors de l’interprétation du tag, et le nom de la politique sera transmis en paramètre (paramètre in_policy). La propriété associée au tag sera indiquée par le paramètre in_property. Le code de cette méthode est de la même forme que celui de la méthode exposée dans la partie précédente. |
||