Je désire faire une action QUE quand l'application est lancée la première fois dans tomcat.
Quelle méthode dois-je implémenter pour cela ? :?
Merci. ;)
Version imprimable
Je désire faire une action QUE quand l'application est lancée la première fois dans tomcat.
Quelle méthode dois-je implémenter pour cela ? :?
Merci. ;)
bonjour,
peux-tu être plus précis....
tu souhaites :
1) l'action est exécutée au démarrage de Tomcat => servlet d'initialisation à configurer dans le web.xml (load-on-startup = 0).. cf. ici
2) l'action est exécutée au 1er appel d'une action sur ton serveur d'application :
faire hériter toutes tes actions d'une action à toi, et dans la méthode "execute", tu fais un test par rapport à un booléan qui est présent ou non dans le scope Application... et tu fais ce que tu dois faire "une fois"....
3) si l'action que tu souhaites exécuter est une action struts, tu dois faire en sorte que te servlet démarre après la servlet de struts... mais même en faisant ça, je ne suis pas sûr que ça fonctionne.
Personnellement, je trouve la solution de la servlet d'initialisation plus simple mais en fait, tout dépend de ce que tu veux exécuter au lancement de l'application.;)
je suis tout à fait d'accord avec toi... mais comme il a utilisé le terme "action"... je ne savais pas si c'était une action "struts".... et je ne suis pas sûr qu'une servlet d'initialisation puisse appeler une action Struts.... même si elle chargée après?
en sais-tu plus?
Suite à vos conseils, je viens d'ajouter ce code dans l'Action père à toutes les autres Action du prg :
Mais à chaque fois que l'appli est lancée, les fichiers sont effacés. :aie:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private static boolean initP = false; public void init() { try { if (! initP) { Fichier.supprimeFichiersTmp(); initP = true; } } catch (Exception e) { // ne rien faire } }
Ce que je veux, c'est l'effacement des fichiers QUE QUAND l'appli est lancée la première dans tomcat.
Comment faire cela ? :?
Merci. ;)
Si tu veux exécuter un traitement au démarrage du serveur, la solution consiste à créer une servlet, implémenter la méthode init et de configurer le web.xml, comme ceci :
A+Code:
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
41 package le.nom.du.package; /** * */ public class Automatic extends HttpServlet { private static final long serialVersionUID = 1L; public void init(ServletConfig config) { ... // Code à exécuter au lancement du serveur ... // Test d'un paramètre (web.xml) if ( config.getInitParameter("startBatch").equals("1") ) { ... } } } ET LE WEB.XML (extrait) =========== ... <servlet> <servlet-name>Automatic</servlet-name> <servlet-class>clemessy.phenix.batch.Automatic</servlet-class> <init-param> <param-name>startBatch</param-name> <param-value>1</param-value> </init-param> <init-param> <param-name>loopInterval</param-name> <param-value>500</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ...
Oups :oops: c'était le test qui n'était pas bon.
En fait la solution est bonne. :king:
A+ ;)
bonjour,
comme ce que tu souhaites faire "suppression des fichiers temporaires" n'est pas une action struts, tu as plutôt intérêt à faire une InitServlet... comme je l'ai indiqué dans la 1ère solution, j'ai mis un lien vers une page exemple.
sinon, si tu préfères utiliser l'Action "mère" de toutes les actions, tu dois écrire :
ne pas utiliser l'attribut static!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 private void init(HttpServletRequest request) { try { Boolean initP = request.getSession().getServletContext().getAttribute("initP"); if (initP == null || ! initP.booleanValue()) { Fichier.supprimeFichiersTmp(); request.getSession().getServletContext().setAttribute("initP", Boolean.TRUE); } } catch (Exception e) { // ne rien faire } }
Vu le besoin, il n'est pas utile de passer par une Action Struts.
Donc, la solution de créer une servlet d'initialisation est je pense la plus adaptée :
:arrow: Exemple de définition de la servlet d'initialisation dans le web.xml :
avec un load-on-startup différent de celui de l'ActionServlet de Struts.Code:
1
2
3
4
5 <servlet> <servlet-name>InitServlet</servlet-name> <servlet-class>nomDuPackage.InitServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
:arrow: Exemple de servlet d'initialisation :
EDIT : là, j'ai été doublement grillée.:mouarf:Code:
1
2
3
4
5
6
7 public class InitServlet extends HttpServlet { public void init() { Fichier.supprimeFichiersTmp(); } }
Ici on charge un paramétrage simple, est ce valable pour le chargement d'un fichier de propriété qu'il va falloir traiter pour construire une classe statique?(en plus je doute d'avoir un droit de modification du web.xml).
Dans ce cas suis je obligé de passer par une méthode init dans une classe action mère comme expliquer au dessus (cette classe action mère ne serait utilisée que pour ça)?
tu peux faire ce que tu veux dans la Servlet tant que tu n'appelles pas du code "Struts"... donc, tu peux tout à fait lire un fichier properties pour charger des "constantes"...
mais si tu n'as pas accès au fichier web.xml (ce qui est bien dommage car c'est juste une servlet)... tu dois passer par la méthode décrite plus haut....
Merci c_nvy pour ces précisions. :mrgreen:
Néanmoins je ne désire pas définir une servlet d'initialisation dans le fichier xml struts, justement parce que c'est un fichier xml et qu'il est modifiable à souhait par un simple éditeur de texte. :aie:
Au fait, à ce sujet, est-il possible de remplacer le fichier xml de struts par un fichier compilé ou un fichier binaire ? :?
Merci pour les informations à ce sujet. ;)