2009-12-21 3 views
14

Je veux intercepter une demande en utilisant le RequestDispatcher, et je veux transmettre la demande ainsi à une autre servlet - quelque chose comme ceci:Un demandeur RequestDispatcher gère-t-il la méthode HTTP de la demande d'origine?

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/some.ThirdPartyServlet" + "?" + "param_name=" + "somevalue"); 
dispatcher.forward(request, response); 

Si la requête entrante était un POST, sera le régulateur de demande prendre mes nouveaux paramètres, et les inclure dans le corps du message, ou est-ce maintenant devenir un GET?

Répondre

15

Il conserve la demande d'origine, sans la modifier. Donc, il restera POST s'il était POST.

7

Si vous utilisez le transfert, le contrôle reste dans le conteneur de servlet, les attributs de demande sont conservés et la demande reste un POST. C'est lorsque vous utilisez la redirection que cela provoque l'envoi d'une réponse au navigateur, provoquant une requête GET, qui perd les attributs de requête pour la requête d'origine car le GET est une requête entièrement nouvelle.

14

Je pense que votre préoccupation est plutôt la disponibilité de la demande passée paramètres (pas les attributs comme d'autres mentions). Dans ce cas, peu importe que vous utilisiez un forward ou une redirection. Mais si vous utilisez un renvoi à un autre Servlet, la méthode appropriée associée à la demande initiale obtenue par HttpServletRequest#getMethod() sera invoquée. Si c'est POST, doPost() sera invoqué. Vous pouvez toujours accéder aux paramètres supplémentaires dans la chaîne de requête de la manière habituelle par HttpServletRequest.getParameter().

Donc, fondamentalement, ce qui suit dans servlet1:

protected void doPost(HttpServletRequest request, HttpServletResponse response) { 
    request.getRequestDispatcher("servlet2?foo=bar").forward(request, response); 
} 

peut essentiellement être manipulé par servlet2 comme suit:

protected void doPost(HttpServletRequest request, HttpServletResponse response) { 
    String foo = request.getParameter("foo"); // Returns "bar". 
}