IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

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.

SommaireLayout (10)
précédent sommaire suivant
 

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.

Mis à jour le 15 février 2015 c_nvy Robin56

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"/>
et également ajouter l'attribut includeScript="true" dans le tag <layout:dynMenu>
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.

Mis à jour le 15 février 2015 c_nvy Robin56

  • 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é.

Mis à jour le 15 février 2015 OButterlin Robin56

  • 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 cet exemple j'affiche une liste de choix parmi trois libellés : jour, semaine, mois. L'utilisateur ne peut choisir qu'une seule de ces options.

  • 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();

Mis à jour le 15 février 2015 Robin56 tomy29

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.

Mis à jour le 15 février 2015 benneb Robin56

  • 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
et ensuite il faut ajouter l'attribut model="fixedHeader" dans le tag <layout:collection> :
Code JSP : Sélectionner tout
<layout:collection property="maCollection" model="fixedHeader" height="200">
Pour que cela fonctionne, ne pas oublier d'inclure les fichiers Javascript et CSS de Struts-Layout comme indiqué ici.

Il faut également avoir la version 1.3 de Struts-Layout.

Mis à jour le 15 février 2015 c_nvy Robin56

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"/>

Mis à jour le 15 février 2015 c_nvy Robin56

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).

Mis à jour le 15 février 2015 c_nvy Robin56

  • 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; 
    } 
... 
}

Mis à jour le 15 février 2015 OButterlin Robin56

  • 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" />

Mis à jour le 15 février 2015 ckermorgant Robin56

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2022 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.