3. Communication entre Servlets: Partage de contrôle
3.1. Généralités : l'interface RequestDispatcher
3.1. 1. Présentation
L'interface RequestDispatcher possède deux méthodes qui permettent le partage de contrôle de requêtes; la première méthode forward() permet la délégation d'une requête à une autre Servlet et la deuxième méthode include() inclut le contenu d'un fichier à une autre Servlet.
- void forward(ServletRequest request, ServletResponse response) : cette méthode forward une requête à partir d'une Servlet vers une autre ressource qui peu être une Servlet, un fichier JSP, ou un fichier HTML présent dans le Server.
- void include(ServletRequest request, ServletResponse response): cette méthode va inclure le contenu d'une ressource (servlet, JSP page, HTML file) dans la réponse renvoyée au client. La réponse peut être ainsi construite à partir d'un ensemble de contenus générés par divers composants web. Dans ce cas la première Servlet conserve le contrôle.
3.2. Fonctionnement de 'interface RequestDispatcher
3.2.1. Délégation
La délégation est obtenue par un distributeur de requête, c'est-à-dire par une instance de la classe "javax.servlet.RequestDispatcher". La Servlet qui se sert de cette instance obtient un distributeur sur la requête vers un composant de l'application (servlet, jsp, fichier statique, ...) en indiquant son URI par la méthode:
public RequestDispatcher ServletRequest.getRequestDispatcher(String uri) ;
l'URI peut être:
- relatif; dans ce cas on reste dans le contexte de la Servlet courante
- absolu; dans ce cas l'"URI" est interprété relativement à la racine du contexte
Le chemin ( l'URI) peut être complété par une chaîne d'interrogation comme on le verra dans un exemple ci-dessous.
C'est La méthode forward(...) de l’interface RequestDispatcher qui permet de faire ce renvoie d'une requête d’une Servlet à une autre ressource sur le serveur:
"void forward(ServletRequest req, ServletResponse res)" : ici on a une redirection de requête
RequestDispatcher dispat = req.getRequestDispatcher("/index.html"); dispat.forward(req,res);
req est un objet de type ServletRequest qui représente la requête faite par le client à la Servlet ; getRequestDispatcher est une méthode de ServletRequest
res est un objet de type ServletResponse représentant la réponse faite au client par la Servlet .
On voit bien que le chemin est relatif au contexte de l'application (cela est précisé par la présence de "/" au début de l'URI). La réponse ne doit pas être traitée après qu'on est fait appel à "forward(..)" sinon on a un levée d'exception.
....
3.2.2. inclusion de contenu
La méthode include(...) de l’interface RequestDispatcher inclut le contenu d’une ressource dans la réponse courante
RequestDispatcher dispat = req.getRequestDispatcher("/index.html");
dispat.include(req,res);
La différence avec une distribution par renvoi est que la Servlet appelante garde le contrôle de la réponse et qu' elle peut inclure du contenu avant et après le contenu inclus
Possibilité de transmettre des informations lors de l’inclusion
- en attachant une chaîne d’interrogation (au travers de l’URL)
- en utilisant les attributs de requête via la méthode setAttribute(...)
Exemple
public class IncluderServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(""); RequestDispatcher dispat = req.getRequestDispatcher("included.html");
dispat.include(req,res); out.println(" "); req.setAttribute("bonjour", "Bonjour"); dispat.include(req,res); out.println(" "); //Cette Servlet réalise trois inclusions req.setAttribute("bonsoir", "Bonsoir"); dispat.include(req,res);
out.println(" "); out.println(""); }
}
...(à suivre)