Communication Inter-Servlet

Communication Inter-Servlet - Java - Programmation

Marsh Posté le 28-09-2002 à 01:12:23    

Bonjour a tous,
 
Je me demandais s'il etais possible d'appeler une methode d'une servlet par l'intermediaire d'une autre servlet.....
 
Je m'explique ( au fait j'utilise tomcat) :
 
J'ai : - une servlet traitant les requetes
       - une servlet d'administration
 
Je voudrais que cette servlet d'administration puisse appeler des methodes de la servlet traitant les requetes ( exemple demander le nombre de requetes traitées en accedant a sont compteur.)
 
J'ai beaucoup cherché et je ne pense pas que ma solution puisse se trouver dans le chainage de servlet, a vrai dire, je ne sais meme pas si c'est techniquement possible ce que je chercher a faire :D !
 
Merci d'avance
 
Fab.

Reply

Marsh Posté le 28-09-2002 à 01:12:23   

Reply

Marsh Posté le 28-09-2002 à 01:30:50    

Une petite precision pour eviter de me faire flammer et d'avoir des solutions sur lequels j'aurai deja investiguer, il n'est apparement plus possible de passer par le "ServletContext" en utilisant la methode getServlet :
 

Citation :

getServlet(java.lang.String name)  
          Deprecated. As of Java Servlet API 2.1, with no direct replacement.  
This method was originally defined to retrieve a servlet from a ServletContext. In this version, this method always returns null and remains only to preserve binary compatibility. This method will be permanently removed in a future version of the Java Servlet API.  
 
In lieu of this method, servlets can share information using the ServletContext class and can perform shared business logic by invoking methods on common non-servlet classes.


 
 :( , et je ne trouve pas de solution de remplacement.
 
Si vraiment je ne trouve pas, est-il possible d'utiliser une vielle version de servlet.jar qui me permettrait d'utiliser cette methode ?!

Reply

Marsh Posté le 28-09-2002 à 03:05:57    

ben enfin ils te la donnent la solution.
et c'est le plus propre à faire.
l'idée c'est que tu crées un objet qui gere la "logique business", et tes differentes servlets utilisent le meme objet.
 
sinon tu peux tjs forwarder tes requetes d'une servlet a une autre avec le RequestDispatcher
 


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 30-09-2002 à 18:21:43    

........ok, merci maître Greg  :jap: !
 
Mais y'a un petit truc qui me chiffone. Si j'utilise un objet pour gerer mon "logique business" (ex: une classe qui compte les hits), il faut bien qu'a un moment donné je passe le "handle" a mes servlets....et je ne vois pas comment faire :( !
 
En tout ca, merci pour ton aide, je vais essayer d'investiguer dans cette direction :) !

Reply

Marsh Posté le 30-09-2002 à 20:36:30    

Je serais toi, j'utiliserai une classe de type singleton pour gérer les hits.
 
Un truc du style:
 

Code :
  1. class HitCounter {
  2.   private int count = 0;
  3.   private static HitCounter hitCounter = new HitCounter();
  4.   private HitCounter() {
  5.   }
  6.   public int getCount() {
  7.     return count;
  8.   }
  9.   public void incCount() {
  10.     count++;
  11.   }
  12.   public static HitCounter getInstance() {
  13.     return hitCounter;
  14.   }
  15.   public static final addCount() {
  16.     getInstance().incCount();
  17.   }
  18. }


 
Comme cela, inutile de passer une référence pour utiliser l'objet, tu utilises les méthodes statiques directement.
 
Bon, je sais pas s le code est tout à fait exact mais l'idée y est
 

Reply

Marsh Posté le 30-09-2002 à 20:40:18    

Ben c'est un peu l'idée des beans, non ? Ou alors j'ai rien compris a ce qui se passe

Reply

Marsh Posté le 30-09-2002 à 20:54:46    

Non, à mon avis tu prends ça pour un bean parcequ'il y a une méthode getXXX() dans le tas.  
 
Comme une classe de type compteur de hits n'a pas besoin d'être instanciée 50 fois mais une seule fois, tu crées une classe de type singleton (instanciable une seule fois car constructeur privé) et tu appelles ses méthodes statiques pour incrémenter le compteur ou retourner la valeur du compteur.
 
J'ai oublié quand même quelque chose, il faudrait que les méthodes getCounter() et incCounter() soient synchronisées pour éviter les conflits d'accès à la variable par plusieurs threads.

Reply

Marsh Posté le 30-09-2002 à 20:59:53    

nan, j'ai bien vu que tu faisais pas un bean, mais je me demandais si le but des beans c'était pas justement le passage de valeur des servlets vers le reste du monde.

Reply

Marsh Posté le 30-09-2002 à 21:10:50    

Oui, en effet c'est bien le principe des beans. J'avais pas pensé que la valeur du compteur puisse être affichée dans un client web. Pour moi, ça n'avait une valeur utile que pour un administrateur...
 
Donc dans le premier cas, faudrait utiliser un bean pour encapsuler la valeur du compteur et l'utiliser dans une JSP

Reply

Marsh Posté le 30-09-2002 à 22:04:02    

Oui, avec ce systeme de classe singleton ca devrait être OK.
Ca marche d'ailleurs pour toutes les methodes et attributs static apparement).
 
Peut-etre que --greg-- connait un moyen de recuperer un "handle" commun a 2 servlets. Moi en tout ca je ne vois pas etant donné que je ne definis meme pas de constructeur :??:  :??: .
 
En tout cas, merci beaucoup a vous tous. Vous m'aidez beaucoup :) !

Reply

Marsh Posté le 30-09-2002 à 22:04:02   

Reply

Marsh Posté le 01-10-2002 à 00:40:34    

qu'est-ce que tu entends par "handle" :??:


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 01-10-2002 à 11:22:50    

:non:  :non:  :non:  
 
pas de static avec des servlets !!!!! jamais !!!!!
 
Comment tu feras le jour où tu devra déployer 2 applis sur le même serveur ??? elles vont se mélanger les instances statiques et ca va te faire des bugs de folie !
 
pour ton histoire de compteur, le plus simple c'est d'écrire un objet Compteur et tu l'attaches au Contexte. Ce contexte tu peux le récupérer dans n'importe quelle servlet en fesant un getServletContext().
 
Pour créer l'instance de compteur et l'attacher à la servlet tu peux utiliser les ServletContextListener qui sont fait pour ca !
 
 
mais jamais de static !!!! les static c'est pas bo !!!

Reply

Marsh Posté le 01-10-2002 à 14:19:57    

J'entends par "handle", un pointeur sur mon objet par l'intermediaire duquel je pourrais lancer l'appel aux methodes.
 
L'idée du texte en anglais (voir plus haut) est d'utiliser un objet commun a mes deux servlets.
Je me demandais comment obtenir le handle du meme objet, dans chaque servlet.
 
Apparement selon benou, je dois passer par la :
 

Citation :

[...]écrire un objet Compteur et tu l'attaches au Contexte. Ce contexte tu peux le récupérer dans n'importe quelle servlet en fesant un getServletContext().  
 
Pour créer l'instance de compteur et l'attacher à la servlet tu peux utiliser les ServletContextListener qui sont fait pour ca !


 
Je me demandais si --Greg-- avait un autre moyen....
 

Reply

Marsh Posté le 01-10-2002 à 14:21:07    

n'importe quelle instance associée a la session...

Reply

Marsh Posté le 01-10-2002 à 14:24:58    

bartleby a écrit a écrit :

J'entends par "handle", un pointeur sur mon objet par l'intermediaire duquel je pourrais lancer l'appel aux methodes.
 
L'idée du texte en anglais (voir plus haut) est d'utiliser un objet commun a mes deux servlets.
Je me demandais comment obtenir le handle du meme objet, dans chaque servlet.
 
Apparement selon benou, je dois passer par la :
 

Citation :

[...]écrire un objet Compteur et tu l'attaches au Contexte. Ce contexte tu peux le récupérer dans n'importe quelle servlet en fesant un getServletContext().  
 
Pour créer l'instance de compteur et l'attacher à la servlet tu peux utiliser les ServletContextListener qui sont fait pour ca !


 
Je me demandais si --Greg-- avait un autre moyen....
 
 



non, c'est ça qu'il faut faire :D


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 01-10-2002 à 15:09:32    

pkio, il est plus crédible que moi greg ?
[:ruisseau de larmes]

Reply

Marsh Posté le 01-10-2002 à 16:03:50    

benou a écrit a écrit :

pkio, il est plus crédible que moi greg ?
[:ruisseau de larmes]



[:blandine]


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 01-10-2002 à 19:31:47    

Citation :

pkio, il est plus crédible que moi greg ?


 
Houlla, loin de moi l'idée de denigrer une personne qui a la gentillesse de m'aider  ;) !
 
Je cherche seulement a avoir le plus d'avis possible pour avoir quelque chose d'ultra-propre ( c'est pour un eventuel employeur alors....)
 
Pardon si j'ai eté maladroit [:tracker] benou !
 
Donc pour recapituler ma servlet doit faire :
 

Citation :


 
 extends HttpServlet extends ServletContextListener
 
 Comporter l'implementation des methodes suivantes :
 
 void contextDestroyed(ServletContextEvent sce)  
 void contextInitialized(ServletContextEvent sce)  
 
 et je rajoute une methode:
 
 void contextChanged(ServletContextEvent sce)
 dans laquelle j'attache (bind) un objet au ServletContexte.
 
 dans les autres servlets, je fais de meme, mais là je recupere  
 mon objet...


 
 Oui, mais comment je peux connaitre l'ordre d'initialisation de mes servlets ?! Comment savoir laquel doit attacher l'objet au contexte et lequels doivent recuperer l'objet ?
[/quote]

Reply

Marsh Posté le 01-10-2002 à 19:50:26    

Ah oui, c'est vrai que ma solution (classe statique) ne marche pas si on déploit l'application plusieurs fois sur le serveur. Oops...
 
Sinon, pour s'assurer de l'ordre d'init de tes servlets, tu peux préciser dans le fichier web-xml dans quel ordre elles doivent se charger au moyen du paramètre <load-on-startup> par exemple. En tout cas, c'est comme ça que je fais...

Reply

Marsh Posté le 01-10-2002 à 19:51:50    

J'ai peut-être pas été assez précis. Tu peux créer une servlet d'initialisation de la webapp dont le rôle est de créer les objets et de les rattacher au ServletContext par exemple...

Reply

Marsh Posté le 01-10-2002 à 19:54:33    

Ok, merci machin :) !
 
Sinon pour d'eventuel futur lecteur, j'ai posté un peu vite :
 
La servlet doit etendre (ou implementer je sais plus): ServletContextAttributeListener
 
Ainsi que les methodes :
 
void attributeAdded(ServletContextAttributeEvent scab)  
void attributeRemoved(ServletContextAttributeEvent scab)  
void attributeReplaced(ServletContextAttributeEvent scab)  
 
Voila, avec ca et l'ordre de chargements des servlets je pense que j'ai tout pour arreter de vous embeter.
 
Merci pour tout [:tracker] forum.hardware.fr/JAVA !!

Reply

Marsh Posté le 01-10-2002 à 19:58:24    

Citation :

Tu peux créer une servlet d'initialisation de la webapp dont le rôle est de créer les objets et de les rattacher au ServletContext par exemple...


 
Oui, je peux faire comme ca. Ou alors je choisie une servlet pour que celle-ci ajoute l'objet au contexte (le bind en fait) et je specifie que c'est celle-ci qui doit être chargée en derniere ( pour que toutes les autres soient pretent a exectuer la methode "void attributeAdded(ServletContextAttributeEvent scab) " )
 
:) !!

Reply

Marsh Posté le 01-10-2002 à 21:50:59    

bartleby a écrit a écrit :

Citation :

pkio, il est plus crédible que moi greg ?

Pardon si j'ai eté maladroit [:tracker] benou !




y a pas de mal, tu peux te relever ;)

Reply

Marsh Posté le 01-10-2002 à 21:58:50    

bartleby a écrit a écrit :

Ok, merci machin :) !
 
Sinon pour d'eventuel futur lecteur, j'ai posté un peu vite :
 
La servlet doit etendre (ou implementer je sais plus): ServletContextAttributeListener
 
Ainsi que les methodes :
 
void attributeAdded(ServletContextAttributeEvent scab)  
void attributeRemoved(ServletContextAttributeEvent scab)  
void attributeReplaced(ServletContextAttributeEvent scab)  




 
ben non, c'est pas ca !

Reply

Marsh Posté le 01-10-2002 à 22:07:31    

tu fais une classe qui implémente ServletContextListener  : http://java.sun.com/products/servl [...] tener.html
 
ta méthode contextInitialized devra ressembler à ca :
 

Code :
  1. public void contextInitialized(ServletContextEvent sce) {
  2.    sce.getServletContext().setAttribute("compteur", new Compteur());
  3. }

 
 
ensuite tu déclares le listener dans le fichier de déploiment web.xml :
<listener>
     <listener-class>leNomCompletDeTonListener</listener-class>  
</listener>
 
et c'est tout !  
Tu peux ensuite récupérer le compteur dans tes servlets et jsp en fesant un

(Compteur) getServletContext().getAttribut("compteur" )


 
 
 
et si tu te sers du context listener, oublie les loadonstratup et les servlets d'intialisation


Message édité par benou le 01-10-2002 à 22:32:31
Reply

Marsh Posté le 01-10-2002 à 22:30:20    

bartleby a écrit a écrit :

[quote]"void attributeAdded(ServletContextAttributeEvent scab) "  




oublie cette méthode, elle ne te sert à rien !

Reply

Marsh Posté le 02-10-2002 à 12:40:21    

benou a écrit a écrit :

tu fais une classe qui implémente ServletContextListener  : http://java.sun.com/products/servl [...] tener.html
 
ta méthode contextInitialized devra ressembler à ca :
 

Code :
  1. public void contextInitialized(ServletContextEvent sce) {
  2.    sce.getServletContext().setAttribute("compteur", new Compteur());
  3. }

 
 
ensuite tu déclares le listener dans le fichier de déploiment web.xml :
<listener>
     <listener-class>leNomCompletDeTonListener</listener-class>  
</listener>
 
et c'est tout !  
Tu peux ensuite récupérer le compteur dans tes servlets et jsp en fesant un

(Compteur) getServletContext().getAttribut("compteur" )


 
 
 
et si tu te sers du context listener, oublie les loadonstratup et les servlets d'intialisation




 
[:cupra]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-10-2002 à 12:50:48    

[:cupra]


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 02-10-2002 à 12:52:42    

--greg-- a écrit a écrit :

[:cupra]




 
ca va hein! Pas chaque fois! C'est mon tour maintenant :)


Message édité par darklord le 02-10-2002 à 12:52:49

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-10-2002 à 14:09:04    

ouep. le coup du ServletContextListener, c'est dark qui me l'a appris ! :jap:

Reply

Marsh Posté le 02-10-2002 à 14:17:39    

:ange:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-10-2002 à 14:57:30    

[:cupra] :o


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 02-10-2002 à 15:52:37    

Citation :

ben non, c'est pas ca !


 
DOH ! Pour une fois, je pensais que ma puissance de reflexion (lol) m'avait permis de trouver [:wam]!!
 
Bon, a part venir chez moi taper le code je vois pas comment vous pourriez plus m'aider  :D !
 
Sinon, ca pouvait vraiment pas marcher mon truc avec void attributeAdded(ServletContextAttributeEvent scab) :??:  :??: ....


Message édité par bartleby le 02-10-2002 à 15:54:03
Reply

Marsh Posté le 02-10-2002 à 18:05:50    

Citation :

SAXParseEXception : Element type "listener" must be declared.


 
Tant pis, il y a pleins d'autres metiers qu'informaticien, je vais aller vendre des beignets sur les plages..... :(  :(  :(  
 
J'ai l'impression que l'element "listener" n'est pas dans la DTD...
 
Mais essaye de changer de version de TomCat, aprés j'abandonne..... :(

Reply

Marsh Posté le 02-10-2002 à 18:10:35    

roo montre ton web.xml


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-10-2002 à 18:21:53    

Voila chef......
 

Citation :

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
        "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
 
 
 
<web-app>
 
  <listener>
     <listener-class>QuizzPropertiesInitializer</listener-class>
  </listener>
 
 
        <servlet>
 
                <servlet-name>QuizzHandler  
                </servlet-name>
                 
          <description> This servlet handles quizzs, according to requested (english or french version),if it is activated.  
    </description>
         
                <servlet-class>QuizzHandler
                </servlet-class>
 
                <load-on-startup>5
                </load-on-startup>
 
        </servlet>
 
 
        <servlet>
 
                <servlet-name>QuizzLanguageSelection
                </servlet-name>
                 
          <description>This servlet return a VoiceXML page that allows user to choose a language,
     then it direct user to the QuizzHandler with an appropriate value for the language variable
    </description>
     
                <servlet-class>QuizzLanguageSelection
                </servlet-class>
 
                <load-on-startup>5
                </load-on-startup>
 
        </servlet>
 
        <servlet>
                <servlet-name>QuizzAdministration
                </servlet-name>
                 
          <description>This servlet allows user to get information about the quizz results and allows to
    activate and deactivate the servlet.
    </description>
     
                <servlet-class>QuizzAdministration
                </servlet-class>
 
                <load-on-startup>5
                </load-on-startup>
        </servlet>
 
 
        <servlet>
 
                <servlet-name>
                        QuizzArchiver
                </servlet-name>
         <description>
          This servlet save result and especially winner's informations.
  </description>
                <servlet-class>
                        QuizzArchiver
                </servlet-class>
 
 
 
  <!-- The path for the submit directory-->
  <init-param>
                <param-name>SERVLET_PATH_ROOT</param-name>
                <param-value>D:\jakarta-tomcat-4.0.4\webapps\Quizz</param-value>
  </init-param>    
 
                <load-on-startup>5</load-on-startup>
 
        </servlet>
 
        <servlet-mapping>
                <servlet-name>
                        QuizzHandler
                </servlet-name>
                <url-pattern>QuizzHandler/*</url-pattern>
        </servlet-mapping>
 
        <servlet-mapping>
                <servlet-name>
                        QuizzLanguageSelection
                </servlet-name>
                <url-pattern>QuizzLanguageSelection/*</url-pattern>
        </servlet-mapping>
 
        <servlet-mapping>
                <servlet-name>
                        QuizzAdministration
                </servlet-name>
                <url-pattern>QuizzAdministration/*</url-pattern>
        </servlet-mapping>
 
        <servlet-mapping>
                <servlet-name>
                        QuizzArchiver
                </servlet-name>
                <url-pattern>QuizzArchiver/*</url-pattern>
        </servlet-mapping>
 
 
 
</web-app>

Reply

Marsh Posté le 02-10-2002 à 18:26:07    

oué avec tomcat y'avait une grosse merde, et ça ne marchait que dans un certain ordre, attend j'essaie de retrouver ça...
(mais je confond ptet avec les filtres, je sais plus)
sinon ben ouais si ton tomcat est <4 ça va pas marcher:)
 
 
bon ben ici on a dans l'ordre
<display-name...
<description...
<context-param...
<filter...
<filter-mapping...
<listener...
<servlet...
<servlet-mapping...
<session-config...
<taglib...


Message édité par --greg-- le 02-10-2002 à 18:28:08

---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 02-10-2002 à 18:29:41    

Citation :

<!DOCTYPE web-app
       PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
       "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

 
 
c'est à partir de 2.3 ... (enfin i'm'semble)


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 02-10-2002 à 18:41:24    

--greg-- a écrit a écrit :

 

Citation :

<!DOCTYPE web-app
       PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
       "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

 
 
c'est à partir de 2.3 ... (enfin i'm'semble)




je confirme : il est pas dans le 2.2 et il est dans le 2.3 !
 
=> t'as juste à chanegr un caractère pour que ca marche ! :)

Reply

Marsh Posté le 02-10-2002 à 19:04:30    

De mieux en mieux ouinnnnnnnnnnn !
 
J'utilise :
 

Citation :

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">


 
et voila la choucroute que je recupere :
 

Citation :

ERROR reading java.io.ByteArrayInputStream@1549f94
At Line 97 /web-app/servlet-mapping/
 
Starting service Tomcat-Apache
Apache Tomcat/4.0.4

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed