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 définir une Action comme une page d'accueil d'une application ?
- Comment faire un « redirect » vers une ressource avec Struts ?
- Comment automatiser la population des chaînes contenant des dates ?
- Pourquoi ma page HTML est-elle tronquée à l'affichage suite à l'exécution d'une action Struts ?
- Comment écrire soi-même le flux de réponse ?
- [Struts 2] Existe-t'il un mode debug avec Struts 2 ?
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.
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> |
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
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.
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.
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; } |
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" /> |
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.