FAQ StrutsConsultez toutes les FAQ
Nombre d'auteurs : 25, nombre de questions : 96, dernière mise à jour : 23 février 2015 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
- Comment inclure les fichiers Javascript et CSS de Struts-Layout ?
- Comment afficher un menu de type dynMenu ?
- Comment afficher plusieurs propriétés d'un objet dans une même colonne ?
- Comment afficher une liste de radios ?
- Comment ranger certaines lignes d'un layout:collection dans une ou plusieurs catégories ?
- Comment fixer l'entête d'une collection "scrollable" ?
- Comment intégrer une image dans le header d'une colonne d'une collection ?
- Comment rendre "disable" un bouton submit ?
- Je n'arrive pas à afficher la liste des valeurs de suggestion ?
- Comment utiliser des formateurs avec Struts Layout ?
Deux solutions :
- Remplacer la balise <html> par le tag <layout:html>.
Ce tag ajoutera également dans la page les balises <html>, <head>, <title>, <base> et <body> - Ajouter dans la balise <head> le tag suivant :
Code JSP : | Sélectionner tout |
<layout:skin includeScript="true"/>
Inclure les fichiers JavacScript et CSS de Struts-Layout est essentiel au bon fonctionnement des tags Struts-Layout.
Ajouter le tag <layout:html> au début de la jsp
- Créer un fichier properties dans le répertoire des sources, par exemple DynMenu.properties avec le code suivant :
Code XML : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | width=100 left_position=100 top_position=50 font_color="#D1D3FD" mouseover_font_color="#FFFFFF" background_color="#336699" mouseover_background_color="#274465" border_color="#000000" separator_color="#000000" top_is_permanent=1 top_is_horizontal=1 tree_is_horizontal=0 position_under=1 top_more_images_visible=1 tree_more_images_visible=1 evaluate_upon_tree_show="null" evaluate_upon_tree_hide="null" |
Si vous souhaitez que le dynMenu soit vertical, il suffit de modifier la propriété top_is_horizontal comme ceci :
Code XML : | Sélectionner tout |
top_is_horizontal=0
- Référencer le nom du fichier properties sans l'extension .properties dans l'attribut config du tag layout:dynMenu :
Code JSP : | Sélectionner tout |
1 2 3 4 | <layout:dynMenu config="DynMenu" left="20" top="50"> <layout:menuItem key="cle.menu1" link="menu1.html"/> <layout:menuItem key="cle.menu2" link="menu2.html"/> </layout:dynMenu> |
Si vous souhaitez mettre votre fichier DynMenu.properties dans un répertoire, il faut ajouter le nom du répertoire dans l'attribut config comme ceci :
Code JSP : | Sélectionner tout |
<layout:dynMenu config="nomDuRepertoire.DynMenu" left="20" top="50">
Si vous ne voulez pas utiliser le tag <layout:html> parce que vous voulez gérer vous-mêmes les balises <html>, <head>, <base> et <body>, il faut ajouter le tag suivant dans la balise <head> :
Code JSP : | Sélectionner tout |
<layout:skin includeScript="true"/>
Le fait d'ajouter cet attribut dans le tag <layout:dynMenu> permet d'inclure le fichier javascript HM_Loader.js qui est obligatoire pour l'affichage du dynMenu et qui n'est pas inclus par le tag <layout:skin includeScript="true">.
Donc, dans le cas où vous n'utilisez pas le tag <layout:html>, il faut obligatoirement faire ses deux étapes sinon le dynMenu ne s'affichera pas.
- Créer une classe étendant DispatchFormatter :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.struts; public class LocalFormatter extends DispatchFormatter { public LocalFormatter() { super(); } /* * Formateur pour un objet UICollaborateur * Résultat attendu -> prénom NOM (initiales) */ public String uiCollaborateur(Object value, PageContext pageContext) { if(value == null) return ""; if ( value instanceof UICollaborateur ) { UICollaborateur collaborateur = (UICollaborateur)value; StringBuilder sb = new StringBuilder(80); sb.append(collaborateur.getPrenom()).append(" ").append(collaborateur.getNom().toUpperCase()).append(" (").append(collaborateur.getInitiales()).append(")"); return sb.toString(); } return ""; } } |
Toutes les méthodes de mise en forme utilisent la même signature
Code Java : | Sélectionner tout |
public String nomFormateur(Object value, PageContext context)
Le nom de la méthode correspond à la référence du formateur.
- Référencer le formateur dans le fichier Struts-Layout.properties :
Code XML : | Sélectionner tout |
formatter.class = com.struts.LocalFormatter
Utiliser l'attribut type et/ou editType pour indiquer le formateur voulu dans la page en fonction du mode de l'élément. Exemple de mise en forme de l'objet UICollaborateur :
Code JSP : | Sélectionner tout |
1 2 3 4 | <layout:collection property="list" width="100%"> <layout:collectionItem property="collaborateur" type="uiCollaborateur" title="prestation.list.collaborateur"/> <layout:collectionItem property="description" title="prestation.list.description"/> </layout:collection> |
L'utilisation des formateurs ne se limite pas aux listes, de nombreux tags de struts-layout proposent cette fonctionnalité.
- En utilisant le tag <layout:radios> :
Code JSP : | Sélectionner tout |
1 2 3 | <layout:radios property="selectedDureeChoisi" styleClass="LABEL"> <layout:options name="listDuree"/> </layout:radios> |
- Dans mon formbean je déclare et implémente ma liste comme suit :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private ArrayList<String> listDuree; public String getSelectedDureeChoisi() { return selectedDureeChoisi; } public void setSelectedDureeChoisi(String selectedDureeChoisi) { this.selectedDureeChoisi = selectedDureeChoisi; } ... String matin = "Matin"; String midi = "Midi"; String soir = "Soir"; ArrayList<String> maListePeriodicite = new ArrayList<String>(); maListePeriodicite.add(matin); maListePeriodicite.add(midi); maListePeriodicite.add(soir); this.setListPeriodicite(maListePeriodicite); |
- Et dans mon Action je récupère l'option choisie dans la jsp en faisant :
Code Java : | Sélectionner tout |
1 2 | MonFormBean mfb = (MonFormBean) form; String tabDuree = mfb.getSelectedDureeChoisi(); |
Exemple : avec une ligne qui possède, une zone d'observation, un checkbox et un libellé.
Code JSP : | Sélectionner tout |
1 2 3 4 5 | <% int idOffset=0; String categorie_en_cour = ""; ArrayList lignes = (ArrayList) request.getSession(false).getAttribute("lignes"); %> |
- Récupérer l'ArrayList à afficher. ("idOffset" correspond à la position de l'ArrayList lors du parcours) :
Code JSP : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | <layout:collection name="lignes" indexId="index"> <layout:collectionItem property="libelle" /> <layout:collectionItem> <layout:checkbox property="controles[${index}]" layout="false" /> </layout:collectionItem> <layout:collectionItem> <layout:textarea property="commentaires[${index}]" rows="4" cols="50" layout="false" /> </layout:collectionItem> </layout:collection> |
- Afficher ArrayList pour commencer :
Code JSP : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <% if(idOffset < lignes.size()) { String cate_temp = ((monBean)lignes.get(idOffset)).getCategorie(); if(!categorie_en_cour.equals(cate_temp)) { %> <layout:collection name="lignes" offset="<%= idOffset %>" length="1" styleClass="collection1" align="center" > <layout:collectionItem property="categorie"/> </layout:collection> <% } categorie_en_cour = ((monBean)lignes.get(idOffset)).getCategorie(); idOffset++; } %> </layout:collection> |
À la fin d'une itération, on compare la catégorie et si elle est différente, on affiche exactement la même ArrayList mais seulement la catégorie.
- Il suffit de déclarer le renderer fr.improve.struts.taglib.layout.renderer.FixedHeaderCollection dans le fichier Struts-Layout_default.properties en lui donnant un nom.
Si par exemple on l'appelle fixedHeader, il faut le déclarer comme ceci dans le fichier Struts-Layout_default.properties :
Code XML : | Sélectionner tout |
collection.class.fixedHeader = fr.improve.struts.taglib.layout.renderer.FixedHeaderCollection
Code JSP : | Sélectionner tout |
<layout:collection property="maCollection" model="fixedHeader" height="200">
Il faut également avoir la version 1.3 de Struts-Layout.
En utilisant le tag <layout:collectionTitle> comme ceci :
Code JSP : | Sélectionner tout |
<layout:collectionTitle title="cle.title">
Et en définissant, dans le fichier properties, la clé référencée dans l'attribut title, avec comme libellé une balise <img>, comme ceci :
Code JSP : | Sélectionner tout |
cle.title=<img src="images/uneImage.gif" align="center"/>
Il faut mettre le formulaire en mode consultation (INSPECT_MODE) dans l'Action qui s'exécute avant l'affichage du formulaire via le code suivant :
Code Java : | Sélectionner tout |
FormUtils.setFormDisplayMode(request, form, FormUtils.INSPECT_MODE) ;
Et ensuite ajouter l'attribut mode="D,D,F" dans le tag <layout:submit> :
Code JSP : | Sélectionner tout |
<layout:submit mode="D,D,F">Valider</layout:submit>
Le F en troisième position dans l'attribut mode permet de rendre "disable" le bouton submit quand le formulaire est en mode consultation (INSPECT_MODE).
- Modifier la classe fr.improve.struts.taglib.layout.suggest.SuggestAction comme suit :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ... public abstract class SuggestAction extends org.apache.struts.action.Action { public ActionForward execute(ActionMapping in_mapping, ActionForm in_form, HttpServletRequest in_request, HttpServletResponse in_response) throws Exception { // in_response.addHeader("Content-Type", "text/xml"); <- addHeader pose problème in_response.setHeader("Content-Type", "text/xml"); // <- setHeader résout le problème in_response.setHeader("Cache-Control", "no-cache"); String word = in_request.getParameter("word"); String suggestions = getXMLSuggestionList(in_request, word); in_response.getOutputStream().print(suggestions); return null; } ... } |
- Création du formateur : créer une classe qui étende DispatchFormatter, par exemple.
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Formatters extends DispatchFormatter { public String formatMontant(Object o,PageContext in_pageContext){ Double value=(Double)o; String res=""; DecimalFormat df = new DecimalFormat("#,##0.00"); if(value!=null){ res=df.format(value.doubleValue()); res=res.replace(" ", "."); } return res; } } |
- Déclaration du formateur : déclarer cette Classe dans struts-layout_default.properties.
Code XML : | Sélectionner tout |
1 2 | #Formatters formatter.class=fr.gws.utils.Formatters |
- Il faut ensuite indiquer en attribut du tag, le nom de la méthode du formateur (formatMontant dans notre exemple), deux cas sont à distinguer :
Pour les tags qui étendent CollectionInputTag, utilisation de l’attribut inspectFormatter :
Code JSP : | Sélectionner tout |
<layout:datagridColumn inspectFormatter="formatMontant" title="montantHT" property="mtTravauxHt" />
N'oubliez pas de vérifier que votre tld autorise ces attributs (ce n'est pas le cas pour la tld par défaut), il convient alors de les déclarer dans le tag ad-hoc.
Exemple :
Code XML : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | <tag> <name>datagridColumn</name> <tagclass>fr.improve.struts.taglib.layout.datagrid.DatagridColumnTag</tagclass> <bodycontent>empty</bodycontent> ... <attribute> <name>inspectFormatter</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> ... </tag> |
Pour ce type de tag, il faut utiliser les attributs editFormatter et createFormatter si l’on veut appliquer le formatage en mode édition ou création
Pour les autres tags, utilisation de l’attribut type :
Code JSP : | Sélectionner tout |
<layout:text type="formatMontant" key="montantTTC" property="mtTotalTtc" />
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.