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.

SommaireTrucs et Astuces (6)
précédent sommaire
 

Le conteneur de Servlet attend d'un fichier de bienvenue référencé dans un nœud <welcome-file> qu'il soit un fichier physique (une page JSP, un fichier plat…).

Ainsi vous ne pouvez pas mapper directement une Action comme fichier de bienvenue.
Toutefois, il est possible de définir dans une page JSP très simple, un forward automatique grâce à la balise <logic:forward>.
Ce forward se chargera alors de retourner l'action demandée.

Dans le fichier struts-config.xml :

Code xml : Sélectionner tout
1
2
3
<action  
  path="/monaction"  ... 
  type="foo.bar.MonType" />

Dans la JSP majsp.jsp :

Code JSP : Sélectionner tout
1
2
3
... 
<logic:forward name="monaction"/> 
...

Dans le fichier web.xml :

Code xml : Sélectionner tout
1
2
3
4
<welcome-files> 
   <welcome-file>majsp.jsp</welcome-file> 
   <welcome-file>...</welcome-file> 
</welcome-files>

L'ouverture de l'application web monapplication retourne le résultat de l'Action mappée par monaction.

Mis à jour le 18 mai 2004 RanDomX

En général, après avoir invoqué une Action, vous souhaitez être redirigé vers l'un des mappings définis dans votre fichier de configuration struts-config.xml.

Code xml : Sélectionner tout
1
2
3
4
5
6
7
8
9
<action path="/monAction"  
             type="struts.action.MonAction"  
             name="monActionForm"  
             scope="session"  
             input="/ma.jsp"  
             validate="true">  
   <forward name="jsp" path="/jsp.jsp"/>  
   <forward name="..." .../>  
</action>

Si à la fin de votre Action vous choisissez le <forward> de nom "jsp", Struts va vous renvoyer la page jsp.jsp, mais sans changer l'URL http://monserveur/monapplication/monAction.do dans votre navigateur.

Or, il peut être intéressant ou souhaité parfois de changer l'URL affichée dans le navigateur pour laisser apparaître la véritable URL de la ressource affichée.

Struts fournit pour cela un attribut qu'il suffit d'ajouter dans l'élément <forward> : l'attribut redirect="true".

Ainsi dans l'exemple précédent, cela donnerait :

Code xml : Sélectionner tout
1
2
3
4
5
6
7
8
9
<action path="/monAction" 
             type="struts.action.MonAction" 
             name="monActionForm" 
             scope="session" 
             input="/ma.jsp" 
             validate="true"> 
   <forward name="jsp" path="/jsp.jsp" redirect="true"/> 
   <forward name="..." .../> 
</action>

Mis à jour le 20 mai 2004 RanDomX

Les Commons BeanUtils ne prennent pas en charge de base la population d'un élément de type java.util.Date à partir d'une chaîne de caractères.
Ainsi, si vous utilisez tel quel un attribut de type Date dans votre formulaire, vous rencontrerez l'erreur suivante :

Code : Sélectionner tout
javax.servlet.ServletException: BeanUtils.populate
Pour résoudre une fois pour toutes ce satané problème, voici ce que j'utilise pour ma part :

Dans un premier temps, je crée un Converter :

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
28
29
30
31
32
33
34
35
36
37
38
39
40
package bla.bla.bla.utils; 
  
import java.text.ParseException; 
import java.util.Date; 
  
import org.apache.commons.beanutils.Converter; 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
  
public class DateConverter implements Converter { 
  
private static final Log logger = LogFactory.getLog(DateConverter.class); 
  
    private Object defaultValue = null; 
  
    public DateConverter() { 
        this.defaultValue = null; 
    } 
  
    public DateConverter(Object defaultValue) { 
        this.defaultValue = defaultValue; 
    } 
  
    public Object convert(Class type, Object value) { 
        if (value == null) { 
            return (defaultValue); 
        } 
  
        if (value instanceof Date) { 
            return (value); 
        } 
  
        try { 
            return WrapperUtil.toDate(value.toString()); 
        } catch (ParseException e) { 
            logger.debug("Unable to convert " + value + " into Date format."); 
            return defaultValue; 
        } 
    } 
}

La classe WrapperUtil doit contenir une méthode statique assurant le formatage et le parsing selon un pattern configurable, j'utilise spring pour injecter le pattern en général... À vous d'implémenter cette classe en fonction de votre application...

Une fois ce converter écrit et testé, il faut l'ajouter à la table des converters utilisés par les BeanUtils.
Pour cela on déclare un plug-in Struts :

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
package bla.bla.bla.struts.plugin; 
  
import javax.servlet.ServletException; 
  
import org.apache.commons.beanutils.ConvertUtils; 
import org.apache.struts.action.ActionServlet; 
import org.apache.struts.action.PlugIn; 
import org.apache.struts.config.ModuleConfig; 
  
import bla.bla.bla.DateConverter; 
  
public class StrutsBootstrapPlugin implements PlugIn{ 
  
    public void destroy() { 
    } 
  
    public void init(ActionServlet actionServlet, ModuleConfig moduleConfig) throws ServletException { 
        ConvertUtils.register(new DateConverter(), java.util.Date.class); 
    } 
  
}

Il ne reste plus qu'à ajouter ce plug-in au struts-config.xml avec la ligne suivante :

Code xml : Sélectionner tout
<plug-in className="bla.bla.bla.struts.plugin.StrutsBootstrapPlugin" />

Il n'en faut pas plus pour que Struts sache convertir définitivement de lui-même les String en Date lors de la population d'un formBean.

Mis à jour le 28 juin 2006 Alwin

L'action Struts couplée à la page JSP utilise un buffer pour générer le code HTML à envoyer sur le navigateur client.
Au fur et à mesure de son remplissage par la Servlet, le buffer est vidé et envoyé au client. Si une erreur se produit pendant l'exécution de la Servlet, l'exécution se termine, le buffer en cours est détruit et n'est pas envoyé. Toutefois comme les buffers précédents ont bien été envoyés (flush), le code HTML affiché par le navigateur se retrouve tronqué.

La troncature du code HTML ne se trouve pas forcément à l'endroit de la dernière écriture précédant l'erreur, car le buffer qui était en cours a été détruit. Il faut donc chercher un peu plus loin.

Mis à jour le 28 juin 2006 jak0

Il arrive de devoir écrire un flux de réponse directement sans renvoyer vers une vue de type JSP (XML, fichier Word, Excel, XML, etc.).
Voici comment réaliser ceci.

Dans le struts-config.xml, créer une action sans forward :

Code xml : Sélectionner tout
1
2
<action name="DocumentForm" path="/documentAction" scope="request"  
	type="actions.DocumentAction" validate="false"/>

S'il n'y a pas de formulaire associé à l'action, omettre l'attribut "name".

Créer une action adaptée de la suivante :

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
public class DocumentAction extends Action { 
  
	public ActionForward execute(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response) 
			throws Exception { 
		// Typer la réponse 
		//response.setContentType(""); 
		// response.setContentLength(1000); 
		//response.setCharacterEncoding(""); 
  
		// Calculer le flux à renvoyer au client 
		byte[] bytes = null; 
  
		// Envoyer le flux dans la réponse 
		OutputStream os = response.getOutputStream(); 
		os.write(bytes); 
		os.close(); 
  
		// Retourne null pour dire à Struts de ne rien faire 
		return null; 
	} 
}

Voici une implémentation possible pour envoyer un flux XML (pour Ajax) :

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
public ActionForward execute(ActionMapping mapping, ActionForm form, 
		HttpServletRequest request, HttpServletResponse response) 
		throws Exception { 
	// Typer la réponse 
	response.setContentType("text/xml"); 
	response.setCharacterEncoding("iso-8859-1"); 
  
	// Calculer le flux à renvoyer au client 
	byte[] bytes = null; 
	StringBuffer xml = new StringBuffer(); 
	xml.append("<?xml version='1.0' encoding='ISO-8859-1' ?>"); 
	xml.append("<reponse>"); 
  
	xml.append("</reponse>"); 
	bytes = xml.toString().getBytes(); 
  
	// Envoyer le flux dans la réponse 
	OutputStream os = response.getOutputStream(); 
	os.write(bytes); 
	os.close(); 
  
	// Retourne null pour dire à Struts de ne rien faire 
	return null; 
}

Voici une implémentation possible pour envoyer un flux/fichier Excel :

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
public ActionForward execute(ActionMapping mapping, ActionForm form, 
		HttpServletRequest request, HttpServletResponse response) 
		throws Exception { 
  
	// Typer la réponse 
	response.setContentType("application/octet-stream"); 
	response.setHeader("Content-Disposition", 
			"attachment; filename=\"fichier.xls\""); 
  
	// Calculer le flux à renvoyer au client 
	FileInputStream is = new FileInputStream("fichier.xls"); 
	byte buffer[] = new byte[1024]; 
	int nbLecture; 
  
	// Envoyer le flux dans la réponse 
	OutputStream os = response.getOutputStream(); 
	while ((nbLecture = is.read(buffer)) != -1) { 
		os.write(buffer, 0, nbLecture); 
	} 
	os.close(); 
  
	// Retourne null pour dire à Struts de ne rien faire 
	return null; 
}

Mis à jour le 4 juin 2008 mattheox

Afin d'avoir le maximum d'informations sur les erreurs potentielles durant le développement d'une application Struts, mais aussi être sur d'avoir une configuration xml rafraichie automatiquement, vous devez ajoutez ces constantes dans votre fichiers struts.xml :

Code XML : Sélectionner tout
1
2
3
<constant name="struts.devMode" value="true" /> 
<constant name="struts.i18n.reload" value="true" /> 
<constant name="struts.configuration.xml.reload" value="true" />

Mis à jour le 23 février 2015 newic500 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
 

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