Communication Inter-Servlet - Java - Programmation
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) |
, 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 ?!
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
Marsh Posté le 30-09-2002 à 18:21:43
........ok, merci maître Greg !
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 !
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 :
|
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
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
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.
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.
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
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 !
Marsh Posté le 01-10-2002 à 00:40:34
qu'est-ce que tu entends par "handle"
Marsh Posté le 01-10-2002 à 11:22:50
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 !!!
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(). |
Je me demandais si --Greg-- avait un autre moyen....
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 :
|
non, c'est ça qu'il faut faire
Marsh Posté le 01-10-2002 à 16:03:50
benou a écrit a écrit : pkio, il est plus crédible que moi greg ? |
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 benou !
Donc pour recapituler ma servlet doit faire :
Citation : |
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]
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...
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...
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 forum.hardware.fr/JAVA !!
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) " )
!!
Marsh Posté le 01-10-2002 à 21:50:59
bartleby a écrit a écrit :
Pardon si j'ai eté maladroit benou ! |
y a pas de mal, tu peux te relever
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 !
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 :
|
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
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 !
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 :
|
Marsh Posté le 02-10-2002 à 12:50:48
ReplyMarsh Posté le 02-10-2002 à 12:52:42
--greg-- a écrit a écrit : |
ca va hein! Pas chaque fois! C'est mon tour maintenant
Marsh Posté le 02-10-2002 à 14:09:04
ouep. le coup du ServletContextListener, c'est dark qui me l'a appris !
Marsh Posté le 02-10-2002 à 14:17:39
Marsh Posté le 02-10-2002 à 14:57:30
ReplyMarsh 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 !!
Bon, a part venir chez moi taper le code je vois pas comment vous pourriez plus m'aider !
Sinon, ca pouvait vraiment pas marcher mon truc avec void attributeAdded(ServletContextAttributeEvent scab) ....
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.....
Marsh Posté le 02-10-2002 à 18:10:35
roo montre ton web.xml
Marsh Posté le 02-10-2002 à 18:21:53
Voila chef......
Citation : <?xml version="1.0" encoding="ISO-8859-1"?> |
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...
Marsh Posté le 02-10-2002 à 18:29:41
Citation : <!DOCTYPE web-app |
c'est à partir de 2.3 ... (enfin i'm'semble)
Marsh Posté le 02-10-2002 à 18:41:24
--greg-- a écrit a écrit :
|
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 !
Marsh Posté le 02-10-2002 à 19:04:30
De mieux en mieux ouinnnnnnnnnnn !
J'utilise :
Citation : <!DOCTYPE web-app |
et voila la choucroute que je recupere :
Citation : ERROR reading java.io.ByteArrayInputStream@1549f94 |
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 !
Merci d'avance
Fab.