Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
996 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Communication Inter-Servlet

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Communication Inter-Servlet

n°221588
bartleby
Posté le 28-09-2002 à 01:12:23  profilanswer
 

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.

mood
Publicité
Posté le 28-09-2002 à 01:12:23  profilanswer
 

n°221602
bartleby
Posté le 28-09-2002 à 01:30:50  profilanswer
 

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 ?!

n°221652
--greg--
Posté le 28-09-2002 à 03:05:57  profilanswer
 

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!
n°221926
bartleby
Posté le 30-09-2002 à 18:21:43  profilanswer
 

........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 :) !

n°222015
MachinBidu​le
Posté le 30-09-2002 à 20:36:30  profilanswer
 

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
 

n°222019
lorill
Posté le 30-09-2002 à 20:40:18  profilanswer
 

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

n°222027
MachinBidu​le
Posté le 30-09-2002 à 20:54:46  profilanswer
 

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.

n°222034
lorill
Posté le 30-09-2002 à 20:59:53  profilanswer
 

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.

n°222040
MachinBidu​le
Posté le 30-09-2002 à 21:10:50  profilanswer
 

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

n°222058
bartleby
Posté le 30-09-2002 à 22:04:02  profilanswer
 

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 :) !

mood
Publicité
Posté le 30-09-2002 à 22:04:02  profilanswer
 

n°222099
--greg--
Posté le 01-10-2002 à 00:40:34  profilanswer
 

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


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
n°222177
benou
Posté le 01-10-2002 à 11:22:50  profilanswer
 

: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 !!!

n°222293
bartleby
Posté le 01-10-2002 à 14:19:57  profilanswer
 

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

n°222295
lorill
Posté le 01-10-2002 à 14:21:07  profilanswer
 

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

n°222299
--greg--
Posté le 01-10-2002 à 14:24:58  profilanswer
 

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!
n°222320
benou
Posté le 01-10-2002 à 15:09:32  profilanswer
 

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

n°222361
--greg--
Posté le 01-10-2002 à 16:03:50  profilanswer
 

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!
n°222489
bartleby
Posté le 01-10-2002 à 19:31:47  profilanswer
 

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]

n°222498
MachinBidu​le
Posté le 01-10-2002 à 19:50:26  profilanswer
 

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

n°222501
MachinBidu​le
Posté le 01-10-2002 à 19:51:50  profilanswer
 

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

n°222505
bartleby
Posté le 01-10-2002 à 19:54:33  profilanswer
 

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 !!

n°222507
bartleby
Posté le 01-10-2002 à 19:58:24  profilanswer
 

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) " )
 
:) !!

n°222531
benou
Posté le 01-10-2002 à 21:50:59  profilanswer
 

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 ;)

n°222533
benou
Posté le 01-10-2002 à 21:58:50  profilanswer
 

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 !

n°222536
benou
Posté le 01-10-2002 à 22:07:31  profilanswer
 

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
n°222538
benou
Posté le 01-10-2002 à 22:30:20  profilanswer
 

bartleby a écrit a écrit :

[quote]"void attributeAdded(ServletContextAttributeEvent scab) "  




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

n°222697
darklord
You're welcome
Posté le 02-10-2002 à 12:40:21  profilanswer
 

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
n°222707
--greg--
Posté le 02-10-2002 à 12:50:48  profilanswer
 

[:cupra]


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
n°222710
darklord
You're welcome
Posté le 02-10-2002 à 12:52:42  profilanswer
 

--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
n°222728
benou
Posté le 02-10-2002 à 14:09:04  profilanswer
 

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

n°222731
darklord
You're welcome
Posté le 02-10-2002 à 14:17:39  profilanswer
 

:ange:


---------------
Just because you feel good does not make you right
n°222758
--greg--
Posté le 02-10-2002 à 14:57:30  profilanswer
 

[:cupra] :o


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
n°222778
bartleby
Posté le 02-10-2002 à 15:52:37  profilanswer
 

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
n°222844
bartleby
Posté le 02-10-2002 à 18:05:50  profilanswer
 

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..... :(

n°222847
darklord
You're welcome
Posté le 02-10-2002 à 18:10:35  profilanswer
 

roo montre ton web.xml


---------------
Just because you feel good does not make you right
n°222854
bartleby
Posté le 02-10-2002 à 18:21:53  profilanswer
 

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>

n°222856
--greg--
Posté le 02-10-2002 à 18:26:07  profilanswer
 

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!
n°222858
--greg--
Posté le 02-10-2002 à 18:29:41  profilanswer
 

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!
n°222863
benou
Posté le 02-10-2002 à 18:41:24  profilanswer
 

--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 ! :)

n°222876
bartleby
Posté le 02-10-2002 à 19:04:30  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Communication Inter-Servlet

 

Sujets relatifs
[C++/Linux] Communication inter-processus[BC++ v3.1] Comment gérer communication asynchrone par COM1 sous DOS?
IntelliJ Idea, debugage d'une servlet via Tomcat4Récupérer tous des choix multiples d'une form en HTML dans une servlet
[java-servlet] question sur la conccurencelancement d'un servlet
Utiliser les classes contenues dans un .zip dans une servlet (Tomcat 4Utiliser une servlet dans une jsp
Communication inter processus sous linux 
Plus de sujets relatifs à : Communication Inter-Servlet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR