Академический Документы
Профессиональный Документы
Культура Документы
Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de
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.
Sur ce, nous vous souhaitons une bonne lecture.
L'équipe Java
Ont contribué à cette FAQ :
-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
L'organisation : Les questions sont organisées par thème, les thèmes pouvant eux-même contenir des sous-thèmes.
Lorsqu'une question porte sur plusieurs thèmes, celle-ci est insérée dans chacun des thèmes rendant la recherche plus
facile.
Les réponses : Les réponses contiennent des explications et des codes sources. Certaines sont complétées de fichier à
télécharger contenant un programme de démonstration. Ces programmes sont volontairement très simples afin qu'il
soit aisé de localiser le code intéressant. Les réponses peuvent également être complétées de liens vers d'autres réponses,
vers la documentation en ligne de Sun ou vers un autre site en rapport.
Nouveautés et mises à jour : Lors de l'ajout ou de la modification d'une question/réponse, un indicateur est placé à coté
du titre de la question. Cet indicateur reste visible pour une durée de 15 jours afin de vous permettre de voir rapidement
les modifications apportées.
J'espère que cette faq pourra répondre à vos questions. N'hésitez pas à nous faire part de tous commentaires/remarques/
critiques.
Web designer : Toute personne capable de faire une meilleure mise en page, une feuille de style ou de belles images...
Correcteur : Malgré nos efforts, des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contacter les
responsables si vous en débusquez une... Idem pour les liens erronés.
-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est
déposée à la SACD.
Remerciements
Auteurs : L'équipe Java ,
Un grand merci à tous ceux qui ont pris de leur temps pour la réalisation de cette FAQ.
Aux rédacteurs :
Remerciements tout d'abord à tous ceux qui ont rédigé les questions et les réponses.
Aux correcteurs :
Remerciements également aux personnes qui ont relu les textes pour supprimer un maximum de fautes de français.
A l'équipe Java :
Remerciements tous particuliers aux membres de la rubrique Java pour leurs conseils, corrections, relectures, idées,
etc. Bref, merci pour leur travail d'équipe qui a permis de faire aboutir ce projet.
Aux visiteurs et membres de DVP :
Remerciements enfin à tous ceux qui ont consulté cette FAQ, et qui, par leurs remarques, nous ont aidé à la
perfectionner.
Remerciements particuliers à Cyberzoide, Braim, babylone07 et Clément Cunin
-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Pour configurer l'ActionServlet, vous devez dans un premier temps déclarer la servlet et lui attribuer un alias:
<web-app>
<servlet>
<servlet-name>action<servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
...
</web-app>
<servlet-name> définit l'alias dont vous devez vous servir dans le reste du descripteur de déploiement web.xml.
<servlet-class> définit le nom entièrement qualifié de la servlet ActionServlet.
<load-on-startup> (entier positif) sert à attribuer une priorité de chargement de la servlet par le conteneur, 1 étant la
priorité la plus élevée.
Pour définir quelles sont les requêtes que la servlet ActionServletdoit intercepter, il faut configurer le mapping de celle-ci:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Dans cet exemple, toutes les requêtes qui finissent par *.do sont interceptés et traités par la servlet ActionServlet.
Il est d'usage d'utiliser *.do ou /do/* comme expression régulière pour définir le mapping.
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config<param-name>
<param-value>/WEB-INF/struts-config.xml<param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
</web-app>
Vous pouvez changer cette valeur pour faire pointer le paramètre vers le fichier de votre choix.
Vous pouvez déclarer plusieurs fichiers de configuration en les séparant par des virgules.
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config/moduleXXX<param-name>
<param-value>/WEB-INF/struts-config_moduleXXX.xml<param-value>
</init-param>
</servlet>
...
</web-app>
Vous pouvez changer cette valeur pour faire pointer le paramètre vers le fichier de votre choix.
Vous pouvez déclarer plusieurs fichiers de configuration en les séparant par des virgules.
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml,/WEB-INF/struts-config2.xml
</param-value>
</init-param>
Ceci peut s'avérer très intéressant lorsque les fichiers de configurations prennent de l'importance.
Cela peut permetre de séparer les différentes parties de ces fichiers.
-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Attention cependant par la suite aux collisions de noms de formBean et d'actions plus difficiles à éviter lorsqu'on utilise
plusieurs fichiers.
Par exemple si vous souhaitez afficher la page monindex.jsp comme page d'entrée de l'application, il faut le déclarer
comme ceci:
<web-app>
<welcome-file-list>
<welcome-file>monindex.jsp</welcome-file>
</welcome-file-list>
</web-app>
lien : Comment définir une Action comme une page d'accueil d'une application ?
Pour pouvoir les utiliser dans les pages JSP, il faut les déclarer leurs descripteurs dans le fichier de configuration
web.xml.
<web-app>
...
<taglib>
<taglib-uri>AliasTaglib;</taglib-uri>
<taglib-location>CheminRelatifAuContexte/NomDuDescripteur</taglib-location>
</taglib>
</web-app>
<web-app>
...
<taglib>
<taglib-uri>StrutsHtml</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
</web-app>
-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Attention, les exigences de la déclaration varient en fonction de l'implémentation de J2EE/Java EE. A partir de J2EE
1.4 il n'est plus nécessaire de déclarer les taglibs dans le web.xml.
- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Cependant, la tendance (et c'est ce qui est préconisé par l'auteur de Struts) est à l'utilisation massive de la JSTL
(si possible combinée à EL) en remplaçement des balises Struts (hors bibliothèque html et ses extensions dans la
bibliothèque nested).
Un exemple :
<html:select property="position">
<c:forEach begin="1" end="20" var="i">
<html:option value="${i}">${i}</html:option>
</c:forEach>
</html:select>
Cette directive n'est pas pas toujours appliquée dans cette FAQ pour des raisons historiques et de compréhension.
exemple :
<bean:define id="test">
<br/>
</bean:define>
<%-- génère <br> pour afficher <br/> --%>
<bean:write name="test" filter="true" />
<%-- génère <br/> pour générer un saut de ligne --%>
<bean:write name="test" filter="false" />
- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
lien : Comment vérifier si l'utilisateur est identifié et si sa session n'a pas expiré?
<controller>
<set-property property="processorClass"value="com.developpez.faq.struts.FaqRequestProcessor"/>
</controller>
// On vérifie si la session a expirée : la session expire si l'id de la session n'est pas valide
protected boolean isSessionValid(HttpServletRequest request) throws ServletException {
if (request != null) {
return request.isRequestedSessionIdValid();
}
return false;
}
- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
return false;
}
public MonActionMapping() {
super();
}
Ensuite, dans votre fichier struts-config.xml, dans une action quelconque, par exemple ici TitreSecondaireInit, vous la
déclarez en rajoutant le paramètre className :
Ensuite, dans l'implémentation de l'action, ici fr.appli.actions.TitreSecondaireInit, il ne vous reste plus qu'à récupérer
le paramètre level comme ceci :
package fr.appli.actions;
// Imports à faire
- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
public TitreSecondaireInit() {
super();
}
- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<form-beans>
<form-bean name="monBean" type="com.developpez.form.MonActionForm" />
...
</form-beans>
L'attribut name désigne l'alias que vous utiliserez dans vos formulaires JSP et/ou HTML.
<form-beans>
<form-bean name="monDynaBean" type="org.apache.struts.action.DynaActionForm">
</form-bean>
...
</form-beans>
L'attribut name désigne l'alias que vous utiliserez dans vos formulaires JSP et/ou HTML.
L'attribut type désigne le nom complètement qualifié de la classe d'implémentation de votre DynaActionForm.
De plus, il faut spécifier un certain nombre de propriétés qui seront les attributs de votre DynaActionForm grâce aux
éléments de types <form-property>
• initial qui représente la valeur par défaut de la propriété selon son type.
• name qui représente le nom de la propriété du dynabean.
• size qui représente le nombre d'élément si la propriété est un tableau.
• type qui représente le nom entièrement qualifié du type de la propriété, suivi de [] si c'est un tableau.
<form-beans>
<form-bean name="personDynaBean" type=" org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String" />
<form-property name="firstname" type="java.lang.String" />
<form-property name="birthDate" type="java.util.Date" />
</form-bean>
...
- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
</form-beans>
- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
La gestion déclarative des exceptions crée aussi un message de type ActionMessage (ActionError pour les premières
versions de Struts) à partir de la clé de ResourceBundle indiquée. Ce message est alors utilisé par la page jsp spécifiée
pour l'affichage d'un message d'erreur.
Le plus grand avantage de ce type de déclaration, outre le fait de centraliser les exceptions, est sans doute de permettre
de ne pas polluer le code source des classes Actions avec des blocs try/catch redondants dans plusieurs classes.
Pour déclarer une exception , il suffit de créer un noeud de type <exception> au fichier struts-config.xml :
<exception
key="error.message.key"
path="/page.jsp"
scope="request"
type="java.handled.exception.type" />
<global-exceptions>
<exception
key="error.database.failure"
path="/dbfailure.jsp"
scope="request"
type="com.developpez.DatabaseException" />
</global-exceptions>
Si une exception de type DatabaseException est levée, le framework Struts redirigera la requête vers la page dbfailure.jsp
et affichera dans celle-ci le message dont la clé est error.database.failure.
- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<action>
...
<exception
key="error.database.failure"
path="/myactionerror.jsp"
scope="request"
type="com.developpez.DatabaseException" />
</action>
Si une exception de type DatabaseException est levée, le framework Struts redirigera la requête vers la page
myactionerror.jsp et affichera dans celle-ci le message dont la clé est error.database.failure.
- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="org.postgresql.Driver" />
<set-property property="url" value="jdbc:postgresql://localhost/mydatabase" />
<set-property property="username" value="me" />
<set-property property="password" value="test" />
<set-property property="maxActive" value="10" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="false" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="validationQuery" value="SELECT COUNT(*) FROM users" />
</data-source>
</data-sources>
<data-sources>
<data-source key="FirstDataSource" type="org.apache.commons.dbcp.BasicDataSource">
... <!-- idem question précédente --> ...
</data-source>
<data-source key="SecondDataSource" type="org.apache.commons.dbcp.BasicDataSource">
... <!-- idem question précédente --> ...
</data-source>
...
- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
</data-sources>
Il est cependant possible de changer cette implémentation par une autre, comme par exemple celle fournie avec Oracle.
Pour ce faire, il suffit de spécifier le nom qualifié de cette classe comme valeur de l'attribut type dans le noeud <data-
source>
<data-sources>
<data-source type="oracle.jdbc.pool.OracleDataSource">
...
</data-source>
</data-sources>
- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<message-resources parameter="application.resources"/>
<message-resources parameter="foo.bar.custom.myCustomResource" key="Custom"/>
Pour faire référence à ce dernier, vous devez spécifier une valeur pour l'attribut bundle :
lien : Comment charger plusieurs fichiers de ressources (bundles) sans avoir à utiliser les clés des bundles ?
lien : Comment définir les fichiers de localisation en dehors du classpath ?
I18NHelper
/**
* Return the message resources for localization
*/
private static MessageResources getMessageResources(HttpServletRequest request) {
/**
* Get the localized message
*/
public static String getLocalizedMessage(HttpServletRequest request, String messageKey) {
if(messageResources != null) {
if(localizedMessage == null) {
localizedMessage = "N/A";
}
- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
I18NHelper
return localizedMessage;
}
Ainsi, imaginons que dans notre fichier de localisation, nous avons un message de ce style :
prompt.hello=Bonjour
Alors dans l'action struts, pour recupérer le message dans la bonne locale, il faut faire:
lien : Comment gérer l'internationalisation (I18N) et/ou la localisation avec Struts ? : Le ResourceBundle
<action path="/BasicAction"
type="org.apache.struts.actions.ForwardAction"
parameter="/WEB-INF/jsp/resultats.jsp"
/>
<action path="/BasicAction"
forward="/WEB-INF/jsp/resultats.jsp"
/>
- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Ex : si votre langue par défaut est l'anglais, vous aurez dans MyResourceBundle.properties une entrée du type :
default.welcome=hello
Si vous souhaitez supporter le francais, vous aurez dans le fichier MyResourceBundle_fr.properties la mème entrée :
default.welcome=bonjour
Il en sera de même pour toutes les langues et vous aurez autant de fichiers .properties que de langues que vous
supporterez.
Il vous faudra ensuite déclarer ces ressources dans le descripteur de configuration de votre application (struts-
config.xml) :
Attention: il ne faut pas préciser l'extension du fichier (.properties) et ne pas spécifier les codes ISO.
Il faut aussi absolument veiller à ce que le fichier soit accessible dans le CLASSPATH.
Dans les pages JSP, il faut déclarer l'internationalisation avec l'attribut locale du tag <html:html> :
<html:link page='/switch.do?lang=fr&cty=FR'>FR</html:link>
- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<html:link page='/switch.do?lang=en&cty=EN'>EN</html:link>
<html:link page='/switch.do?lang=en&cty=US'>US</html:link>
Ces liens pointent sur une Action "SwitchAction" définie dans le mapping par l'alias "switch".
// définition de la locale
setLocale( request, new Locale( language, country ) );
return forward;
}
}
Attention: certains serveurs ne transmettent pas le referer. Il faut donc explicitement le récupérer (dans un ActionForm
par exemple).
Comment formater une valeur d'un bean avec Struts ? : Les attributs "format" et "formatkey"
Auteurs : Lionel Roux (aka RanDomX) ,
Il faut utiliser l'attribut format du tag <bean:write>.
Ainsi, si la valeur numérique de la variable number de l'ActionForm référencé par "mybean" vaut 123456789, elle sera
affichée 123,456,789.00, conformément au pattern #,##0.00 .
Vous pouvez aussi localiser les patterns de formatage, pour différencier ceux-ci en fonction de la langue. Pour ce faire,
il faut embarquer ceux-ci dans les bundles de ressources.
Ex :
- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
number.format=#,##0.00
Attention: le pattern utilisé doit être compatible avec la langue. Par exemple, '#,##0.00' ne fonctionnera pas avec la
locale 'fr', puisque c'est un pattern anglais.
Comment charger plusieurs fichiers de ressources (bundles) sans avoir à utiliser les clés des bundles ?
Auteurs : Alwin ,
Le principe consiste à fusionner les resources-bundles au chargement.
Voici la classe qui se charge de le faire (l'API commons Logging est utilisée dans cet exemple pour la journalisation) :
package bla.bla.bla.struts;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.util.MessageResourcesFactory;
import org.apache.struts.util.PropertyMessageResources;
- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
}
}
return;
}
static
{
log = LogFactory.getLog(MultiPropertyMessageResources.class);
}
}
package bla.bla.bla.struts;
import org.apache.struts.util.MessageResources;
- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
import org.apache.struts.util.PropertyMessageResourcesFactory;
public MultiPropertyMessageResourcesFactory()
{
}
<message-resources
parameter="fichier1,fichier2,fichier3"
factory="bla.bla.bla.struts.MultiPropertyMessageResourcesFactory"
/>
Cette solution règle bien évidemment le problème pour toutes les ressources utilisées par Struts, en particulier le plugin
Validator.
Remarque : cette classe est une version améliorée de celle proposée pour la question sur le chargement de plusieurs
ResourceBundle (cf. lien).
package com.vvic.struts.utils;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.util.MessageResourcesFactory;
import org.apache.struts.util.PropertyMessageResources;
- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
if (props.size() < 1) {
try {
is = new URL(name).openStream();
props.load(is);
is.close();
} catch (Throwable t) {
log.error("loadLocale()", t);
}
}
if (props.size() < 1) {
- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
}
}
return;
}
static {
log = LogFactory.getLog(MultiPropertyMessageResources.class);
}
}
<message-resources
parameter="resources.application,file:///workspace/globalResources/erreurs"
factory="com.vvic.struts.utils.MultiPropertyMessageResourcesFactory"
/>
lien : Comment charger plusieurs fichiers de ressources (bundles) sans avoir à utiliser les clés des bundles ?
- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<SCRIPT>
function setHidden(value){document.formulaire.hidden.value=value;}
</SCRIPT>
Dans le formulaire:
<html:form action="/cartManagement">
...
<html:hidden property="hidden" value="default"/>
...
<html:submit onclick="setHidden('add');">ADD ELEMENT</html:submit>
</html:form>
Ensuite dans l'Action concernée, il suffit de créer les méthodes portant les mêmes noms que les valeurs possibles du
champs hidden à la place de la méthode execute(...).
Dans le fichier de configuration struts-config.xml, il faut ajouter à la déclaration de l'action l'attribut "parameter" et
lui indiquer le nom du champ concerné.
<action
path="/cartManagement"
type="app.management.CartAction"
name="cartForm"
scope="request"
validate="true"
input="/page.jsp"
parameter="hidden"/>
- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Il est aussi possible de créer des boutons dont les noms sont les noms des méthodes, car le nom d'un bouton est aussi
la valeur renvoyée par celui-ci.
<action
path="/cartManagement"
type="app.management.CartAction"
name="cartForm"
scope="request"
validate="true"
input="/page.jsp"
parameter="monAction"/>
Dans la JSP, les boutons sont nommés grâce à une clé du Comment gérer l'internationalisation (I18N) et/ou la
localisation avec Struts ? : Le ResourceBundle.
<html:form action="/cartManagement">
<html:submit property="monAction">
<bean:message key="button.add"/>
</html:submit>
<html:submit property="monAction">
<bean:message key="button.delete"/>
</html:submit>
</html:form>
Les valeurs passées sont ainsi localisées et changent donc en fonction de la locale. Pour mapper ces valeurs à une méthode
particulière, on ajoute à l'Action une méthode qui est appelée lors de la soumission :
- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Le reste est identique au Comment factoriser plusieurs actions réalisables sur un seul ActionForm ? : Le DispatchAction.
Donc dans un formulaire si vous avez plusieurs html:submit et un html:cancel vous n'avez plus à vous soucier la manière
de récupérer l'appel dans l'action.
Il suffit juste d'implémenter la méthode "cancelled" et de rajouter la propriété cancellable pour l'action dans le fichier
struts-config.xml (une sécurité pour explicitement déclarer que cette action est annulable) :
<action ...>
<set-property property="cancellable" value="true"/>
</action>
Attention : il ne faut pas mettre d'attribut "property" dans le tag html:cancel car sinon plus rien ne marchera. En
effet, la validation sera de nouveau effective et l'action voudra appeler la valeur de l'attribut property (identique au
tag html:submit).
Exemple :
On obtient le message d'erreur suivant induit par l'élément de formulaire identifié par "submit" :
- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Bien que les deux systèmes sont à même de faire les deux, on utilise usuellement le plug-in Validator pour les contrôles
de surface, puisqu'il ne nécessite pas d'aller-retour entre le client et le serveur, et la méthode validate() des ActionForms
pour la validation sémantique.
<form-validation>
<formset>
<form name="logonForm">
- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Pour que la validation se fasse également côté client, il convient de suivre les points suivants :
Il existe un ensemble de clés prédéfinies pour les messages d'erreurs les plus communs. Pensez à les ajouter dans votre
fichier de messages.
Ci-dessous la liste des messages les plus courants :
- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Il peut être souhaité, pour une raison ou une autre (flexibilité en cas de changement de nom du formulaire,
normalisation, ...) de pouvoir définir soi même le nom de la fonction générée.
L'attribut method permet cela.
Ainsi, si vous avez besoin d'écrire du code Javascript complémentaire pour la validation de certains éléments du
formulaire, vous n'aurez plus à vous soucier du nom de ce dernier :
function maValidation(form) {
if (...) {
return strutsValidation(form);
}
L'appel de la validation (pouvant inclure l'utilisation du plugin validator) dans une Action nécessite de travailler avec
la classe ActionMessages.
Il est également possible de construire soit-même ses messages (notamment dans le cas d'une vérification nécessitant
un appel métier) et de l'ajouter à l'ensemble des messages.
- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
L'exemple ci-dessous montre l'appel de la validation classique par l'intermédiaire de la méthode validate, l'ajout d'un
message particulier, l'enregistrement des messages d'erreur, puis la gestion de la navigation.
Ce code a pour prérequis, dans le mapping de l'action, d'avoir positionné l'attribut validate à "false" et d'avoir renseigné
l'attribut input.
// Validation du formulaire
ActionMessages errors = form.validate(mapping, request);
// Appel backoffice
boolean existeDoublon = monService.rechercherDoublon(form.getNom());
if (existeDoublon) {
ActionError error = new ActionError("nom.existant");
errors.add("nom", error);
}
if ( !errors.isEmpty() )
{
this.saveErrors(request, errors);
return mapping.getInputForward() ;
}
- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Si la checkbox n'est pas cochée, alors vous devez explicitement donner une valeur (si vous en avez besoin). Dans le cas
contraire, vous ne serez pas capable de détecter qu'une checkbox initialement cochée a été décochée.
Une pratique courante pour contourner ce problème consiste à associer dans l'ActionForm un membre booléen à l'état
de la checkbox, et d'implémenter la méthode reset de l'ActionForm et d'y réinitialiser la valeur à false.
Ainsi, entre la soumission du formulaire et la magie du remplissage automatique des membres de l'ActionForm, la
méthode reset sera appelée et assurera la prise en compte d'un décochage.
- 37 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Ainsi, les valeurs possibles au niveau du formulaire pour l'élément identifié "nomRadio" seront celles de la propriété
id de chaque objet de la collection.
- 38 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Dans l'attribut property du tag html:select, il faut spécifier le nom de la propriété qui contiendra la (ou les) valeur(s)
sélectionnée(s).
Sélection simple
<html:select property="selectedItem">
La propriété selectedItem doit être définie dans l'ActionForm avec getter et setter et doit être de type String.
Sélection multiple
<html:select property="selectedItems" multiple="true">
La propriété selectedItems doit être définie dans l'ActionForm avec getter et setter et doit être de type String[].
1) Dans le cas où la collection a été mise dans le scope via un setAttribute, elle doit être référencée dans le tag html:options
ou html:optionsCollection via l'attribut name.
S'il s'agit d'un tableau de String ou d'Integer, d'une collection de String ou d'Integer, il suffit de coder ceci :
<html:select property="selectedItem">
<html:options name="uneCollection"/>
</html:select>
<html:select property="selectedItem">
<html:options collection="uneCollection" property="id" labelProperty="libelle"/>
</html:select>
ou
<html:select property="selectedItem">
<html:optionsCollection name="uneCollection" value="id" label="libelle"/>
</html:select>
La propriété id spécifiée dans l'attribut property correspond à la valeur renvoyée si celle-ci est sélectionnée et la
propriété libelle spécifiée dans l'attribut labelProperty est le label qui s'affiche dans la liste déroulante.
- 39 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
2) Dans le cas où la collection est une propriété de l'ActionForm et que celle-ci est initialisée via le setter de l'ActionForm
dans une Action qui s'exécute avant l'affichage du formulaire, elle doit être référencée dans le tag html:options ou
html:optionsCollection via l'attribut property.
S'il s'agit d'un tableau de String ou d'Integer, d'une collection de String ou d'Integer, il suffit de coder ceci :
<html:select property="selectedItem">
<html:options property="uneCollection"/>
</html:select>
<html:select property="selectedItem">
<html:optionsCollection property="uneCollection" value="id" label="libelle"/>
</html:select>
S'il s'agit d'une collection de LabelValueBean, celui-ci ayant pour propriété value et label, il n'est pas utile de coder les
attributs value et label dans le tag html:optionsCollection :
<html:select property="selectedItem">
<html:optionsCollection property="uneCollection"/>
</html:select>
Si on veut sélectionner par défaut un élément de la liste déroulante, il suffit d'initialiser la propriété correspondante de
l'ActionForm dans l'Action qui s'exécute avant l'affichage du formulaire via le code suivant :
Ceci implique que le form-bean soit référencé via l'attribut name dans le mapping de cette Action dans le struts-
config.xml.
Dans le cas où la valeur par défaut est fixe, il est possible d'initialiser la propriété selectedItem dans la méthode reset()
dans le cas d'une ActionForm, ou dans l'attribut initial de la balise form-property dans le cas d'une DynaActionForm.
Comment construire des listes de choix dynamiques et dépendantes avec Struts ?: Les DropDownBox.
Auteurs : Lionel Roux (aka RanDomX) ,
Les DropDownBox sont utilisées par exemple quand on choisit une valeur dans une première liste, on souhaite
restreindre les valeurs possibles dans une seconde liste.
- 40 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Lors d'un changement, un premier submit est déclenché par l'événement "onchange" de la liste list1.
Lors de cette soumission, il faut dans l'Action ou dans l'ActionForm définir les valeurs possibles retournées pour la
liste list2.
Ainsi, celles-ci seront affichées lors du réaffichage du formulaire.
Une variante avec association directement de la valeur au formulaire (cas d'un scénario d'édition) consiste à définir la
valeur de la sélection dans l'action préparant l'affichage de la page :
<html:select property="valeurSelectionnee">
<html:optionsCollection property="listeValeur" label="label" value="value" />
</html:select>
- 41 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Ensuite, il faut créer un bean que l'on nommera pour l'exemple "UploadForm" :
{
...
UploadActionForm theForm = (UploadActionForm) actionForm;
FormFile file = theForm.getFichier();
...
}
Voila, vous avez votre objet implémentant FormFile [org.apache.struts.upload] , que vous pouvez manipuler sur le
serveur.
File f = ...;
String filename = f.getName();
response.setContentType("multipart/zip");
response.setHeader("Content-Disposition",
"attachment; filename=\"" +
filename + "\";");
- 42 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
response.setContentLength((int)f.length());
try
{
OutputStream os = response.getOutputStream();
FileInputStream stream = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(stream);
InputStream is = new BufferedInputStream(bis);
int count;
byte buf[] = new byte[4096];
while ((count = is.read(buf)) > -1)
{
os.write(buf, 0, count);
}
is.close();
os.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
..
return mapping.findforward("fichieenvoye");
Ceci provoque l'ouverture d'une boîte de dialogue vous invitant à enregistrer localement le fichier, et vous redirige vers
la ressource correpondant au mapping "fichieenvoye".
<html:link page="/openpdf.do"
name="pdfForm"
property="pdfName"
target="_blank">
<html:img src="./images/PDF.gif" border="0" alt="View PDF"/>
</html:link>
httpServletResponse.setContentType("application/pdf");
httpServletResponse.setContentLength(bos.size());
OutputStream os = httpServletResponse.getOutputStream();
os.write(bos.toByteArray(), 0, bos.size());
os.flush();
os.close();
return null;
- 43 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
- 44 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
lien : Comment enrichir une URL avec la valeur d'une propriété d'un bean local?
lien : Comment enrichir une URL avec la propriété d'un ActionForm Struts ?
- 45 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Dans l'action :
public ActionForward ajouter(...)
{...}
Dans le ResourceBundle :
bouton.ajouter=Ajouter
bouton.modifier=Modifier
<html:link action="tonAction?action=Ajouter">
<bean:message key="bouton.ajouter"/>
</html:link>
Cependant, on n'exploite pas complètement les possibilités du LookupDispatchAction car on passe "en dur" le libellé
de la clé correspondant à la méthode contrairement au cas d'un bouton de type submit où la clé du libellé est suffisante
pour retrouver la méthode à exécuter.
Une solution consiste à utiliser les possibilités du tag <html:link> conjuguées à l'utilisation du tag <bean:define> :
<bean:define id="actionAjouter">
<bean:message key="bouton.ajouter"/>
</bean:define>
- 46 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Une fois que vous avez construit tous vos ActionMessage, vous devez les ajouter à un ActionErrors. C'est cet objet qui
sera retourné.
Il est à noter que pour d'anciennes versions de Struts, il sera fait usage de la classe ActionError en lieu et place de
ActionMessage.
Egalement le paramètre ActionMessages.GLOBAL_MESSAGE peut être remplacé par
ActionErrors.GLOBAL_ERROR dans les premières versions.
error.dynamic={0}
..
..new ActionMessage("error.dynamic", "This_is_my_message");
..
This_is_my_message.
- 47 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Il est à noter que pour d'anciennes versions de Struts, il sera fait usage de la classe ActionError en lieu et place de
ActionMessage.
..
new ActionMessage("error.myerror.foo.bar");
..
Il est à noter que pour d'anciennes versions de Struts, il sera fait usage de la classe ActionError en lieu et place de
ActionMessage.
..
.. am1 = new ActionMessage("error.myerror.foo.bar.custom", "custom");
.. am2 = new ActionMessage("error.myerror.foo.bar.custom", "own");
..
- 48 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
..
new ActionMessage("error.myerror.foo.bar.custom.comp", "custom", "hello you");
..
Il est à noter que pour d'anciennes versions de Struts, il sera fait usage de la classe ActionError en lieu et place de
ActionMessage.
<logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
faire quelque chose de spécifique en cas d erreur
</logic:present>
Attention : ce code semble ne pas fonctionner sous Websphere à cause de l'utilisation de constantes dans la JSP. Il
fonctionne très bien sous Tomcat.
<logic:present name="org.apache.struts.action.ERROR">
faire quelque chose de spécifique en cas d erreur
</logic:present>
3) Implémenter un TagLib :
La TLD
<tag>
<name>isErrors</name>
<tag-class>package.tags.ErrorsTag</tag-class>
<description>Indique s'il y a des messages d'erreur</description>
- 49 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
La TLD
<attribute>
<name>name</name>
<required>false</required>
<type>java.lang.String</type>
<description>
Nom du bean(dans n'importe quel scope) sous lequel les messages d'erreur ont été stockés.
S'il n'est pas défini, c'est le nom spécifié par la constante <code>Globals.ERROR_KEY</code>
qui est utilisé.
</description>
</attribute>
</tag>
Implémentation
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
import org.apache.struts.Globals;
- 50 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Implémentation
public void setName(String name) {
this.name = name;
}
}
Utilisation
<X:isErrors>
faire quelque chose de spécifique en cas d erreur
</X:isErrors>
Pour définir l'opération inverse, à savoir détecter lorsqu'il n'y a pas d'erreur, il suffit par exemple de définir une nouvelle
TagLib qui hérite de la précédente et redéfinit la méthode test.
- 51 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
Le libellé du message (correspondant à la clé error.message dans l'exemple) doit être déclaré dans le fichier properties
d'internationalisation.
Ce message est paramétrable, comme indiqué dans la question sur l'affichage d'un message d'erreur (cf. lien).
idMessage étant le nom de la variable permettant de boucler sur la liste des messages.
message="true" indiquant que ce sont les messages (ActionMessages) et non les erreurs (ActionErrors) que l'on souhaite
afficher.
Pour afficher un message en particulier, et non la liste des messages comme indiqué précédemment, il suffit de préciser
le nom de la variable contenant le message dans l'attribut property du tag <html:messages> comme ceci :
- 52 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
...
try
{
dataSourceA = getDataSource(request, "FirstDataSource");
...
dataSourceB = getDataSource(request, "SecondDataSource");
...
}
...
- 53 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<security-constraint>
<web-resource-collection>
<web-resource-name>
restricted
</web-resource-name>
<url-pattern>/restricted/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
Ainsi, l'Action "/myAction" est accessible par tous les utilisateurs. En revanche, l'Action "/restricted/myProtectedAction"
n'est accessible que par le groupe "admin". Pour plus d'information, lisez la documentation de votre conteneur de
servlet concernant la sécurité.
<logic:present role="admin">
This is hide to non admin user
</logic:present>
- 54 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<plug-in className="foo.bar.MyPlugIn">
<set-property property="path" value="/WEB-INF/my.xml"/>
</plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
- 55 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
<action
path="/monaction" ...
type="foo.bar.MonType" />
...
<logic:forward name="monaction"/>
...
<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.
<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.
- 56 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
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 :
<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>
javax.servlet.ServletException: BeanUtils.populate
Pour résoudre une fois pour toute ce satané problème, voici ce que j'utilise pour ma part :
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 DateConverter() {
this.defaultValue = null;
}
- 57 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
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... A 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 :
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;
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.
Pourquoi ma page HTML est-elle tronquée à l'affichage suite à l'exécution d'une action Struts ?
Auteurs : jak0 ,
L'action Struts couplée à la page JSP utilise un buffer pour générer le code HTML à envoyer sur le navigateur client.
- 58 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
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.
Voici une implémentation possible pour envoyer un flux XML (pour Ajax) :
- 59 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/
La FAQ Struts
xml.append("</reponse>");
bytes = xml.toString().getBytes();
// Typer la réponse
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment; filename=\"fichier.xls\"");
- 60 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2003 - 2009 Developpez LLC. Tout 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://javaweb.developpez.com/faq/struts/