2009-09-11 3 views
20

pourquoiServletContext.getRequestDispatcher() vs ServletRequest.getRequestDispatcher()

getRequestDispatcher (chemin String) de l'interface ServletRequest ne peut pas étendre à l'extérieur du servlet actuel contexte

où comme

getRequestDispatcher (chemin String) de ServletContext peut utiliser la méthode getContext (string uripath) à obtenir RequestDispatcher des ressources dans des contextes étrangers.

et comment?

S'il vous plaît aider

Répondre

34

Si vous utilisez un chemin absolu tel que ("/index.jsp"), il n'y a pas de différence.

Si vous utilisez un chemin relatif, vous devez utiliser HttpServletRequest.getRequestDispatcher(). ServletContext.getRequestDispatcher() ne le permet pas.

Par exemple, si vous recevez votre demande http://example.com/myapp/subdir,

RequestDispatcher dispatcher = 
     request.getRequestDispatcher("index.jsp"); 
    dispatcher.forward(request, response); 

transmettra la demande à la page http://example.com/myapp/subdir/index.jsp.

Dans tous les cas, vous ne pouvez pas transférer une requête à une ressource en dehors du contexte.

+5

Pour "ne peut pas transférer la requête à une ressource en dehors du contexte", je voudrais préciser quel contexte est référé ici. Je suis au fond d'un problème en ce moment et j'ai un contexte où même après avoir obtenu un autre contexte je n'arrive pas à lui envoyer une requête et cette réponse me demande si c'est vraiment impossible et pourquoi J2EE fait des choses simples sacrément difficile. – Trejkaz

0

Je pense que votre première question est tout simplement une question de portée. Le ServletContext est un objet de portée beaucoup plus large (tout le contexte de servlet) qu'un ServletRequest, qui est simplement une requête unique. Vous pouvez consulter la spécification Servlet elle-même pour obtenir des informations plus détaillées. Pour ce qui est de comment, je suis désolé, mais je vais devoir laisser cela à d'autres pour répondre à cette heure-ci.

0

Contexte est stocké à la portée du niveau d'application alors que la demande est enregistrée à la page niveau i.e. dire conteneur Web

apporte les applications une par une et les exécuter à l'intérieur de sa machine virtuelle Java. Il stocke un objet singleton dans son jvm où il enregistre n'importe quel objet qui y est placé.Ce singleton est partagé entre toutes les applications qui s'exécutent à l'intérieur comme il est stocké dans la JVM du conteneur lui-même.

Toutefois, pour les demandes, le conteneur crée un objet de requête rempli de données provenant de la requête et transmis d'un thread à l'autre (chaque thread est une nouvelle requête envoyée au serveur), la requête est également transmise aux fils de la même application.

2

La méthode de demande getRequestDispatcher() peut être utilisée pour faire référence à des servlets locaux dans une application Web unique.

La méthode basée sur le contexte de servlet peut être utilisée pour faire référence aux servlets d'autres applications Web déployées sur le serveur SAME.

+4

Ce dernier n'est pas directement vrai. Vous auriez besoin d'obtenir le 'ServletContext' de l'autre webapp en premier par' ServletContext # getContext() '. – BalusC

1

request.getRequestDispatcher (« url ») signifie que l'envoi est relative aux courants request.Means HTTP Ceci est pour enchaîner deux servlets avec la même application web Exemple

RequestDispatcher reqDispObj = request.getRequestDispatcher("/home.jsp"); 

getServletContext(). GetRequestDispatcher (« url »): l'envoi est par rapport à la racine des ServletContext.Means ceci est pour enchaînant deux applications web avec dans le même serveur/deux serveurs différents

Exemple

RequestDispatcher reqDispObj = getServletContext().getRequestDispatcher("/ContextRoot/home.jsp");