IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

[Servlet] Forward & Response


Sujet :

Servlets/JSP Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut [Servlet] Forward & Response
    Dans mon application, j'ai plusieurs niveaux de classes. En l'occurence, dans l'exemple qui me concerne maintenant :
    - la classe DemandeManager, la servlet contenant le doPost
    - la classe Demande, classe mère implémentant une interface
    - par ex la classe Incident, qui hérite de Demande, et qui contient l'implémentation d'une des méthodes de l'interface
    public String enregistrer(HttpServletRequest req) throws AppliRedirectException
    J'ai déjà utilisé dans ma servlet une instruction de redirection avec succès.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //String page=défini plus haut, contient l'adresse de la jsp sur laquelle on est redirigé
    private String jspdir = "/"+"jsp"+"/";
    RequestDispatcher rd;
    rd = getServletContext().getRequestDispatcher(jspdir +page);
    if (rd != null) 
       	rd.forward(req, res);
    la plupart des traitements sont réalisés dans les classes filles, dont Incident, et j'ai besoin d'utiliser une redirection semblable dans cette classe Incident.
    Le problème, c'est que ma méthode ne dispose pas de paramètre de type Response.

    Ai-je le droit de rajouter ce paramètre dans le prototype de ma méthode enregistrer, en toute impunité? Parce que je ne sais pas du tout quel sera le comportement de l'application si je transmets chaque fois à cette méthode la même Response...

  2. #2
    Membre confirmé Avatar de supermanu
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    330
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 330
    Points : 452
    Points
    452
    Par défaut
    Peux tu me dire si je résume bien l'enchaînement de tes appels de méthodes/classes :

    Dans un premier temps, tu execute le doPost() qui se situe dans la servlet DemandeManager (donc extends HttpServlet ?).

    A l'intérieur de la méthode doPost(), tu fais appel à la méthode enregistrer() de la classe Incident (qui n'est pas une servlet).
    Et dans cette méthode tu redirige vers une jsp.

    Est-ce bien ça ?
    Pensez au tag
    Mon blog Tutoriels et Astuces en Java : http://emmanuelpierre.free.fr/blog/index.php?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    oui, oui, oui. C'est bien ça.
    En attendant, je l'ai testé, en modifiant le prototype de ma méthode.
    La redirection dans la classe Incident fonctionne, et me redirige vers ma jsp Webmail.jsp. (c'est un simple formulaire de mail, dont le submit agît sur une autre Servlet, WebmailManager).
    Pour le coup, j'ai 2 exceptions, qui ont visiblement un rapport avec la redirection, mais qui ne sont pas explicite du tout...
    type Rapport d''exception

    message

    description Le serveur a rencontré une erreur interne () qui l'a empèché de satisfaire la requête.

    exception

    javax.servlet.ServletException: L'enrobeur (wrapper) ne peut trouver la classe servlet commun.WebmailManager ou une classe dont elle dépend
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:844)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:621)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:163)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)

    cause mère

    java.lang.ClassNotFoundException: commun.WebmailManager
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1407)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1252)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:838)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:621)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:163)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
    J'ai bien sûr modifié mon web.xml pour déclarer cette dernière servlet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       <servlet>
    	<servlet-name>WebmailManager</servlet-name>
    	<servlet-class>
    	commun.WebmailManager
    	</servlet-class>
       </servlet>
       <servlet-mapping>
    	<servlet-name>WebmailManager</servlet-name>
    	<url-pattern>/servlet/WebmailManager</url-pattern>
       </servlet-mapping>

  4. #4
    Membre confirmé Avatar de supermanu
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    330
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 330
    Points : 452
    Points
    452
    Par défaut
    Alors pour ton deuxième problème on verra après, mais je te conseille vivement de ne pas faire la redirection dans ta classe Incident.

    Je m'explique.
    A priori ta classe Incident sers à faire des traitement du style enregistrer un incident, supprimer un incident, modifier un incident...
    C'est ce qu'on appelle des actions métiers, qui n'ont rien à voir avec la présentation de ton application. En mettant la redirection dans la méthode enregistrer, tu fais un lien très fort entre les deux.

    Le problème ?
    Le code que tu mets dans la méthode enregistrer n'est utilisable qu'à un seul endroit. tu ne peux pas utiliser cette méthode dans une autre partie de ton application où tu voudrais rediriger vers une autre page.
    Donc c'est fortement déconseillé

    Voilà ce que tu peux faire :

    DemandeManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    doPost(...) {
     ...
     Incident unIncident = new Incident();
     ...
     unIncident.enregistrer();
     
      //puis tu fais le forward ici
      ...
    }
    Incident :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Incident extends Demande {
     
     //cette methode permet d'enregistrer un incident
     //elle ne contient que du code metier
     //aucun lien avec la couche de présentation
     public void enregistrer() {
     ...
     }
    }
    Je ne sais pas si je me suis fais bien comprendre ?
    Pensez au tag
    Mon blog Tutoriels et Astuces en Java : http://emmanuelpierre.free.fr/blog/index.php?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    j'ai bien compris la distinction entre les couches.
    Le problème, c'est que j'interviens sur une application pré existante, sur laquelle plusieurs personnes ont travaillé avant moi, et parfois c'est mal conçu.
    Bref, la raison pr laquelle ça ne peut pas marcher, c'est que mon doPost se termine déjà par un forward, vers la jsp concernée (selon que je crée, consulte, ou modifie une demande).

    En tout cas, la redirection en tant que telle fonctionne, aussi mal écrite qu'elle soit.
    Mais c'est la servlet WebmailManager qui me pose problème, elle n'a pas l'air détectée par Tomcat.

  6. #6
    Membre confirmé Avatar de supermanu
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    330
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 330
    Points : 452
    Points
    452
    Par défaut
    Oui en effet si tu reprends une application un peu mal conçue, c'est galère !

    Sinon pour le deuxième problème, il ne trouve pas la classe en effet. C'est une question bête mais est-ce que le nom du package est correcte ? (j'ai fait un petit test de mon côté et j'ai la même erreur si je met un nom de package qui n'existe pas, ou un nom de package incomplet)

    Ta classe WebmailManager est dans un package commun tout court ou fr.xxx.commun ?
    Pensez au tag
    Mon blog Tutoriels et Astuces en Java : http://emmanuelpierre.free.fr/blog/index.php?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    L'erreur était effectivement un pb de nom de package.
    Je me cassais les dents depuis 2 heures dessus, quand un collègue qui est passé a jeté un oeil dessus 10 secondes, et m'a demandé "ton package, c'est sûr que c'est celui-là?"
    Et la réponse est non, puisque ma classe se trouvait dans le package demande, et pas commun.
    j'ai honte...
    Merci en tout cas pr ton aide.

    Donc pour ceux qui à l'avenir auront aussi cette erreur, si vous avez modifié votre web.xml, vérifiez bien vos noms de packages !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/12/2011, 18h00
  2. [JSP]Cannot forward after response has been committed
    Par hinanui dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/02/2007, 03h11
  3. [ servlet ] forward
    Par Pi2 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/02/2006, 14h09
  4. [servlet][JSP]forwarder dans une frame
    Par deldin dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/06/2004, 18h03
  5. [Servlet] response.getWriter()
    Par phoebe dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 18/05/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo