Le Tutoriel de Java Servlet pour des débutants

View more Tutorials:

1- Introduction

Ce document est basé sur:
  • Eclipse 4.6 (NEON)

  • Servlet 3.0

  • Tomcat 8

2- Qu'est-ce que c'est Servlet?

Les Java Servlet sont des programmes qui s'exécutent sur un serveur Web ou un serveur d'application (Application Server) et constituent une couche intermédiaire entre une demande provenant d'un navigateur Web ou d'un autre client HTTP (Client) et de bases de données ou des applications sur le serveur HTTP (HTTP Server).

À l'aide de Servlets, vous pouvez collecter les entrées des utilisateurs via des formulaires de pages Web, présenter des enregistrements à partir d'une base de données ou une autre source, et créer dynamiquement des pages Web.

3- Le cycle de vie de Servlet

La figure suivante illustre le cycle de vie d'une Servlet. Depuis sa création, les demandes sont traitées par les utilisateurs, jusqu'à ce qu'elles soient détruites.

Il y a 5 étapes:

  1. Charger la classe Servlet dans la mémoire.
  2. Créer l'instance de la Servlet.
  3. Appeler la méthode init() de Servlet.
  4. Appeler la méthode service() de Servlet.
  5. Appeler la méthode destroy() de Servlet.

Les étapes 1, 2 et 3 sont exécutées une seule fois, lorsque la Servlet est initialement chargée. Par défaut, la Servlet n'est pas chargée (load) jusqu'à ce que la première requête soit reçue par l'utilisateur. Vous pouvez forcer le Servlet Container (conteneur à charger la Servlet) lorsque le conteneur démarre.

L'étape 4 est exécutée plusieurs fois - une fois pour chaque requête HTTP vers la Servlet.
L'étape 5 est exécutée lorsque le conteneur de servlet (Servlet Container) décharge (unloaded) la Servlet.

Vous pouvez voir l'illustration suivante pour mieux comprendre le cycle de vie du  Servlet.
Lors de la demande (request) des utilisateurs à Servlet, la Servlet appellera la méthode de service() pour répondre aux demandes des utilisateurs, le service() appellera une des deux méthodes, soit doGet() soit doPost(). Dans votre  Servlet, vous devez presser et résoudre ces méthodes.

Ainsi, lorsque les utilisateurs demandent une Servlet, la Servlet sera créée au moment de la première demande et appellera simultanément la méthode init() de servlet pour l'initialiser, la méthode init() est appelée une seule fois. La méthode destroy() est utilisée pour détruire la servlet, elle ne sera appelée qu'une fois lors de la suppression du déploiement (undeloy) de l'application Web ou de l'arrêt (shutdown) du serveur Web.

4- Installer le Tomcat Web Server

Pour commencer avec Servlet, vous devez télécharger  Tomcat Web Server et le déclarer avec Eclipse. Veuillez consulter ce lien pour suivre des instructions:

5- Créer le projet Web afin de commencer avec Servlet

  • File/New/Other
  • Project Name: ServletTutorial
L'image du Projet qui est créé:
Créez le fichier index.html:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

   <h1>Hello World</h1>

</body>
</html>

6- La configuration d'Eclipse pour exécuter des applications sur tomcat

Jusqu'ici, nous n'avons rien à faire avec Servlet. Et maintenant, nous le confugurons afin d'exécuter l'application web. Ensuite,nous commencerons par  Servlet.
Sur eclipse, cliquez sur le bouton droit du Projet ServletTutorial, sélectionnez  Properties:
Sélectionnez lla position d'installation de  Tomcat 8:
Cliquez sur le bouton droit du projet ServletTutorial, sélectionnez  "Run As/Run on Server".
Le site web est en train d'exécuter sur le navigateur d'  Eclipse.
Le principe de l'opération:
Quand vous accédez le lien URL:
Le site web revoie le contenu de la page  index.html, et c'est compréhensible.

Mais vous devez accédez au lien URL:
Ca signifie que vous ne désignez pas une page précise; le serveur internet va chercher des pages par défaut ayant déclaré dans le tag  <welcome-file> que vous avez déclaré dans  web.xml pour tenir la réponse.
Note: /ServletTutorial est appelé Context-Path. Chaque site web a un Context-Path, et vous pouvez le configurer avec une autre valeur ou laisse le vide. S'il est vide, vous pouvez accéder à votre site web par:
  • http://localhost:8080
  • http://localhost:8080/index.html
Quand il se déroule avec Tomcat,  Context-Path est nommé comme le nom du Projet.
Considérez l'illustration ci-dessous:

7- Quelques classes ont participé dans des exemples

Quelque classes prennent part aux exemples suivants dans ce document.
Constants.java
package org.o7planning.tutorial.beans;

public class Constants {

  public static final String ATTRIBUTE_USER_NAME_KEY ="ATTRIBUTE_USER_NAME_KEY";
   
  public static final String SESSION_USER_KEY ="SESSION_USER_KEY";
   
  public static final String CALLBACK_URL_KEY ="CALLBACK_URL_KEY";
   
}
UserInfo.java
package org.o7planning.tutorial.beans;

public class UserInfo {

   public String userName;
   private int post;
   private String country;
   
   public UserInfo(String userName, String country, int post)  {
       this.userName= userName;
       this.country= country;
       this.post= post;
   }

   public int getPost() {
       return post;
   }

   public void setPost(int post) {
       this.post = post;
   }

   public String getCountry() {
       return country;
   }

   public void setCountry(String country) {
       this.country = country;
   }

   public void setUserName(String userName) {
       this.userName = userName;
   }

   public UserInfo(String userName) {
       this.userName = userName;
   }

   public String getUserName() {
       return this.userName;
   }
}

8- Créez votre première Servlet

HelloServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HelloServlet extends HttpServlet {
   
   private static final long serialVersionUID = 1L;

   
   public HelloServlet() {
   }

   @Override
   protected void doGet(HttpServletRequest request,
           HttpServletResponse response) throws ServletException, IOException {
       
       ServletOutputStream out = response.getOutputStream();
       
       out.println("<html>");
       out.println("<head><title>Hello Servlet</title></head>");
       
       out.println("<body>");
       out.println("<h3>Hello World</h3>");
       out.println("This is my first Servlet");
       out.println("</body>");
       out.println("<html>");
   }

   @Override
   protected void doPost(HttpServletRequest request,
           HttpServletResponse response) throws ServletException, IOException {
       this.doGet(request, response);
   }

}
C'est la première image de  HelloServlet qui vient de créer avec plein d'erreur. C'est simplement parce que vous n'avez pas déclaré la bibliothèque Servlet.
Il est nécessaire de déclarer des bibliothèques de  Servlet. Ces bibliothèques sont seulement des bibliothèques Runtime de Servlet. Elles sont disponibles sur des serveurs internet  Web Server. Nous utilisons Tomcat ici, donc il nous faut le déclarer.

Cliquez le bouton droit du Projet, sélectionnez Properties:
Actuellement le projet n'a plus d'erreur.
Ensuite, vous devez déclarer  HelloServlet et un chemin pour l'accéder dans  web.xml. Vous devez ajouter la configuration ci- dessous:
<!-- Define servlet, named helloServlet -->
<servlet>
   <servlet-name>helloServlet</servlet-name>
   <servlet-class>org.o7planning.tutorial.servlet.HelloServlet</servlet-class>
</servlet>

<!-- Defines the path to access this Servlet -->
<servlet-mapping>
   <servlet-name>helloServlet</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   <display-name>ServletTutorial</display-name>

   
   <servlet>
       <servlet-name>helloServlet</servlet-name>
       <servlet-class>org.o7planning.tutorial.servlet.HelloServlet</servlet-class>
   </servlet>

   <servlet-mapping>
       <servlet-name>helloServlet</servlet-name>
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>


   <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>


</web-app>
Réexécutez le Projet par cliquer le bouton droit et sélectionner:
  • Run As/Run on Server
Vous pouvez observer le principe de l'opération par l'illustration suivante:
Quand un Servlet est appelé, ca dépend de la situation qu'une des deux méthodes de traitement de requêtes  doGet(..) ou  doPost(..) va être appelée.
  • Précisément quand doGet(..) et doPost(..) ont appelées, on va discuter plus tard.
Dans doGet() ou doPost(),  vous pouvew extraire l'objet  ServletOutputStream, c'est le flux de sortie. Il envoie des données au navigateur de l'utilisateur. Appelez  ServletOutputStream.println(..) pour écrire des données dans le courant (stream).
// Le flux de sortie (Output Stream),
// envoie des données au navigateur de l'utilisateur.
ServletOutputStream out = response.getOutputStream();

9- Le paramètre initial de la Servlet

Quand le  servlet est déclaré dans  web.xml, vous pouvez indiquer les valeurs des paramètres initiaux pour les servlets dans les modules Web
InitParamServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class InitParamServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private String emailSupport1;

	public InitParamServlet() {
	}

	// Cette méthode est toujours appelée une seule fois
	// dès que l'objet Servlet est créé.
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);

		// Obtenez la valeur du paramètre d'initialisation (initialization parameter) du Servlet.
		// (Selon la configuration de ce servlet dans web.xml).
		this.emailSupport1 = config.getInitParameter("emailSupport1");
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Obtenez la valeur du paramètre d'initialisation (initialization parameter) de la manière différente.
		String emailSupport2 = this.getServletConfig().getInitParameter("emailSupport2");

		ServletOutputStream out = response.getOutputStream();

		out.println("<html>");
		out.println("<head><title>Init Param</title></head>");

		out.println("<body>");
		out.println("<h3>Init Param</h3>");
		out.println("<p>emailSupport1 = " + this.emailSupport1 + "</p>");
		out.println("<p>emailSupport2 = " + emailSupport2 + "</p>");
		out.println("</body>");
		out.println("<html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Configurant  servlet dans  web.xml:
<servlet>
    <servlet-name>initParamServlet</servlet-name>
    <servlet-class>org.o7planning.tutorial.servlet.InitParamServlet</servlet-class>
    
    <init-param>
        <param-name>emailSupport1</param-name>
        <param-value>[email protected]</param-value>
    </init-param>

    <init-param>
        <param-name>emailSupport2</param-name>
        <param-value>[email protected]</param-value>
    </init-param>

</servlet>    


<servlet-mapping>
    <servlet-name>initParamServlet</servlet-name>
    <url-pattern>/initParam</url-pattern>
</servlet-mapping>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   <display-name>ServletTutorial</display-name>

   
   <servlet>
       <servlet-name>helloServlet</servlet-name>
       <servlet-class>org.o7planning.tutorial.servlet.HelloServlet</servlet-class>
   </servlet>

   <servlet-mapping>
       <servlet-name>helloServlet</servlet-name>
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>


   <servlet>
       <servlet-name>initParamServlet</servlet-name>
       <servlet-class>org.o7planning.tutorial.servlet.InitParamServlet</servlet-class>
       
       <init-param>
           <param-name>emailSupport1</param-name>
           <param-value>[email protected]</param-value>
       </init-param>
       
       <init-param>
           <param-name>emailSupport2</param-name>
           <param-value>[email protected]</param-value>
       </init-param>
       
   </servlet>    
   
   
   <servlet-mapping>
       <servlet-name>initParamServlet</servlet-name>
       <url-pattern>/initParam</url-pattern>
   </servlet-mapping>


   
   <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>


</web-app>
Réexécutez l'application web et exécutez URL:

10- Configurer Servlet avec des  Annotations

Dans Servlet 3.0 ou plus supérieure, vous pouvez configurer Servlet via des annotations. Dans ce projet, nous utilisons la version Servlet 3.x donc nous pouvons configurer via annotation. Prennez un exemple pour illustrer:
AnnotationExampleServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Vous pouvez configurer un ou plusieurs 'Patterns d'URL' (URL pattern)
// pour accéder à cette servlet.
@WebServlet(urlPatterns = { "/annotationExample", "/annExample" }, initParams = {
		@WebInitParam(name = "emailSupport1", value = "[email protected]"),
		@WebInitParam(name = "emailSupport2", value = "[email protected]") })
public class AnnotationExampleServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private String emailSupport1;

	public AnnotationExampleServlet() {
	}

	// En tout cas, int() est garantie à être appelée
	// avant que Servlet ne gère sa première demande..
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);

		this.emailSupport1 = config.getInitParameter("emailSupport1");
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String emailSupport2 = this.getServletConfig().getInitParameter("emailSupport2");

		ServletOutputStream out = response.getOutputStream();

		out.println("<html>");
		out.println("<head><title>Init Param</title></head>");

		out.println("<body>");
		out.println("<h3>Servlet with Annotation configuration</h3>");
		out.println("<p>emailSupport1 = " + this.emailSupport1 + "</p>");
		out.println("<p>emailSupport2 = " + emailSupport2 + "</p>");
		out.println("</body>");
		out.println("<html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Vous pouvez accéder Servlet par un des deux liens suivants:

11- Servlet Url Pattern

Il y a 4 manières pour confuger le chemin de Servlet:
URL Pattern Examples
/* http://example.com/contextPath
http://example.com/contextPath/status/abc
/status/abc/* http://example.com/contextPath/status/abc
http://example.com/contextPath/status/abc/mnp
http://example.com/contextPath/status/abc/mnp?date=today
http://example.com/contextPath/test/abc/mnp
*.map http://example.com/contextPath/status/abc.map
http://example.com/contextPath/status.map?date=today
http://example.com/contextPath/status/abc.MAP
/ Đây là Servlet mặc định.
Quand l'utilisateur entre un lien ou un navigateur, ce lien ou ce navigateur va être envoyé au conteneur web  WebContainerWebContainer doit décider quel Servlet va servir cette requête de l'utilisateur.

La figure suivante va illustrer la fonçon que  WebContainer a déterminé d'utiliser quel Servlet pour servir la requête du client.
Par exemple, crréez un Servlet avec  url-pattern avec astérisque:
  • url-pattern = "/any/*";
AsteriskServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = { "/any/*" })
public class AsteriskServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public AsteriskServlet() {
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		out.println("<html>");
		out.println("<head><title>Asterisk</title></head>");

		out.println("<body>");

		out.println("<h3>Hi, your URL match /any/*</h3>");

		out.println("</body>");
		out.println("<html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Les URL suivants sont servis par   AsteriskServlet (/any/*).

Servlet par défaut:

Servlet avec  url-pattern = /

Etant un servlet par défaut, ce servlet permet de traiter les requête (request) dont son chemin n'accorde à aucun  url-pattern des autre Servlet déclarés dans votre application.
Observez un exemple de Servlet par défaut:
MyDefaultServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = { "/" })
public class MyDefaultServlet extends HttpServlet {

   private static final long serialVersionUID = 1L;

   public MyDefaultServlet() {
   }

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {

       ServletOutputStream out = response.getOutputStream();

       out.println("<html>");
       out.println("<head><title>Page not found</title></head>");

       out.println("<body>");
       out.println("<h3>Sorry! Page not found</h3>");
       out.println("<h1>404</h1>");
       out.println("Message from servlet: " + this.getClass().getName());
       out.println("</body>");
       out.println("<html>");
   }

   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       this.doGet(request, response);
   }

}
Vous pouvez réexécuter l'applicationh web et accéder le chemin:
Dans le lien au- dessus, le  servletPath = /news/tomAndJerry,n'accorde pas au chemin de Servlet que vous avez déclaré. Entre- temps, le  "Servlet par défaut" va servir cette requête.

12- Obtenir les informations de base de la Servlet

Vous pouvez extraire des informations liées au moment que Servlet a servit, par exemple:
  1. L' information demandée par client.
  2. L' information du Serveur
  3. L' information du Client
  4. L' information Header envoie par requête
  5. ....
ExampleInfoServlet.java
package org.o7planning.tutorial.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/other/exampleInfo")
public class ExampleInfoServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public ExampleInfoServlet() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletOutputStream out = response.getOutputStream();

		out.println("<style> span {color:blue;} </style>");

		String requestURL = request.getRequestURL().toString();
		out.println("<br><span>requestURL:</span>");
		out.println(requestURL);

		String requestURI = request.getRequestURI();
		out.println("<br><span>requestURI:</span>");
		out.println(requestURI);

		String contextPath = request.getContextPath();
		out.println("<br><span>contextPath:</span>");
		out.println(contextPath);

		out.println("<br><span>servletPath:</span>");
		String servletPath = request.getServletPath();
		out.println(servletPath);

		String queryString = request.getQueryString();
		out.println("<br><span>queryString:</span>");
		out.println(queryString);

		String param1 = request.getParameter("text1");
		out.println("<br><span>getParameter text1:</span>");
		out.println(param1);

		String param2 = request.getParameter("text2");
		out.println("<br><span>getParameter text2:</span>");
		out.println(param2);

		// Server Infos
		out.println("<br><br><b>Server info:</b>");

		out.println("<br><span>serverName:</span>");
		String serverName = request.getServerName();
		out.println(serverName);

		out.println("<br><span>serverPort:</span>");
		int serverPort = request.getServerPort();
		out.println(serverPort + "");

		// Client Infos
		out.println("<br><br><b>Client info:</b>");

		out.println("<br><span>remoteAddr:</span>");
		String remoteAddr = request.getRemoteAddr();
		out.println(remoteAddr);

		out.println("<br><span>remoteHost:</span>");
		String remoteHost = request.getRemoteHost();
		out.println(remoteHost);

		out.println("<br><span>remoteHost:</span>");
		int remotePort = request.getRemotePort();
		out.println(remotePort + "");

		out.println("<br><span>remoteUser:</span>");
		String remoteUser = request.getRemoteUser();
		out.println(remoteUser);

		// Header Infos
		out.println("<br><br><b>headers:</b>");

		Enumeration<String> headers = request.getHeaderNames();
		while (headers.hasMoreElements()) {
			String header = headers.nextElement();
			out.println("<br><span>" + header + "</span>: " + request.getHeader(header));
		}

		// Servlet Context info:
		out.println("<br><br><b>Servlet Context info:</b>");
		ServletContext servletContext = request.getServletContext();

		// L'emplacement de l'application web dans le disque dur (hard disk).
		out.println("<br><span>realPath:</span>");
		String realPath = servletContext.getRealPath("");
		out.println(realPath);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Observez l'illustration suivante SVP, avec les informations que vous vous concernez:
Réexécutez l'application web et accédez le lien:
Résultat:

13- Forward (Transmettre)

Redirection (Forward): Quand une requête (request) est envoyé à un  Servlet, elle peut rediriger cette requête vers une autre ressource désignée comme une autre page (ou un autre servlet). L'adresse sur le navigateur de l'utilisateur est toujours le même lien de la première page mais le contenu est créé par la page désignée.
La page désignée est obligatoire une page ou un servlet qui se trouve dans votre application web.
Avec l'action de transfert, vous pouvez utiliser  request.setAttribute() pour transférer des données de la page 1 vers la page 2.
ForwardDemoServlet.java
package org.o7planning.tutorial.servlet.other;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.tutorial.beans.Constants;

@WebServlet("/other/forwardDemo")
public class ForwardDemoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// Request:
	// http://localhost:8080/ServletTutorial/other/forwardDemo?forward=true
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Obtenez la valeur de paramètre (parameter) sur URL.
		String forward = request.getParameter("forward");

		if ("true".equals(forward)) {
			System.out.println("Forward to ShowMeServlet");

			// Définissez des données à attribuer (attribute) de la demande.
			request.setAttribute(Constants.ATTRIBUTE_USER_NAME_KEY, //
					"Hi, I'm Tom come from Walt Disney !");

			RequestDispatcher dispatcher //
					= request.getServletContext().getRequestDispatcher("/showMe");
			dispatcher.forward(request, response);

			return;
		}
		ServletOutputStream out = response.getOutputStream();
		out.println("<h3>Text of ForwardDemoServlet</h3>");
		out.println("- servletPath=" + request.getServletPath());
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Réexécutez l'application web et exécutez respectivement 2 liens URL:
Dans le cas 1: Il n'y a pas de  forward. Les données observées sont générées par  ForwardDemoServlet.
Dans le cas 2: Forward est transféré en servlet ShowMeServlet. Dans ce cas, le lien URL ne change pas alors que les données sont générées par  ShowMeServlet.
Forward (Transmission) est souvent utilisé dans les cas où l'utilisateur demande servlet A. Mais cette page exige d'entrer dans le système en avant, le servlet A vérifie l'identifiant de connexion de l'utilisateur et s'il ne fait pas, ce servlet va rediriger vers le servlet Login.
Retournant à  RequestDispatcher, nous avons deux méthodes d'obtenir l' objet  RequestDispatcher.
Dans le cas où  request.getServletContext().getRequestDispatcher(url) renvoie  RequestDispatcher qui est situé relativement avec  contextPath (la position relative en comparaison avec le répertoire racine du site web).
  • http://localhost:8080/contextPath
  • http://localhost:8080/ServletTutorial
request.getRequestDispatcher(url) renvoie à  RequestDispatcher une position relative avec celle de la page courrante.
  • http://localhost:8080/ServletTutorial/other/forwardDemo
Chú ý:
  • Redirect ( réorientation) pertmet de rediriger vers des pages, y compris des pages de l'extérieur des pages du site web.
  • Forward (transmission) permet depuis une servlet de rediriger la requête/réponse vers une autre servlet ou vers une page se trouvant dans le même site web mais il permet de transférer des données entre 2 pages via request.setAttribute.

14- Redirect (Rediriger)

Réorientation (Redirect): Redirect se passe en deux étapes depuis le serveur doit charger le navigateur Web (Page A) sur le côté client pour aller chercher une autre adresse qu'il est redirigé vers (Page B) et termine sa mission. La page désignée soit la page dans l'application web, soit une page extérieure. En conséquence, l'URL dans la barre d'adresse va changer après la redirection.
En revanche de l'action de transfert, l'action redirigeant (Redirect) ne vous permet pas d'utiliser   equest.setAttribute(..)  pour échanger des données de A vers B.
ShowMeServlet.java
package org.o7planning.tutorial.servlet.other;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.tutorial.beans.Constants;

@WebServlet("/showMe")
public class ShowMeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Obtenez de la valeur d'un attribut (attribute) de la demande.
		String value = (String) request.getAttribute(Constants.ATTRIBUTE_USER_NAME_KEY);

		ServletOutputStream out = response.getOutputStream();

		out.println("<h1>ShowMeServlet</h1>");
		out.println(value);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
RedirectDemoServlet.java
package org.o7planning.tutorial.servlet.other;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/other/redirectDemo")
public class RedirectDemoServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	// Request:
	// http://localhost:8080/ServletTutorial/other/redirectDemo?redirect=true
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Obtenez de la valeur de paramètre (parameter) sur URL.
		String redirect = request.getParameter("redirect");

		if ("true".equals(redirect)) {
			System.out.println("Redirect to ShowMeServlet");

			// contextPath: est une chaine vide "" ou non-vide.
			// Si elle est non vide, elle commence toujours par /
			// et ne se termine pas par /
			String contextPath = request.getContextPath();

			// ==> /ServletTutorial/showMe
			response.sendRedirect(contextPath + "/showMe");
			return;
		}

		ServletOutputStream out = response.getOutputStream();
		out.println("<h3>Text of RedirectDemoServlet</h3>");
		out.println("- servletPath=" + request.getServletPath());
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
Réexécutez le serveur du web et exécutez respectivement 2 liens URL dans votre navigateur:
Pour le premier URL:
Avec le deuxième chemin,la requête (request) est redirigée vers  ShowMeServlet, le lien  URL que vous voyez sur le navigateur est le chemin du servlet  ShowMeServlet.

15- La session (Session)

L'interface  HttpSession pertmet de définir la notion de session (session) de l'utilisateur. Une session comprend des informations de l'utilisateur lors de sa navigation sur plusieur requête (request) sur HTTP. Une session permet de suivre un utilisateur lors de sa navigation sur un site.
Quand un utilisateur accède à votre site pour la première fois, un unique ID va être envoyé au utilisateur afin d'identifier un internaute de façon unique. L' ID est généralement stocké dans un cookie ou un paramètre interne pour des requêtes.
Voici comment vous accédez à l'objet de session:
protected void doGet(HttpServletRequest request,
   HttpServletResponse response)
       throws ServletException, IOException {

   HttpSession session = request.getSession();
}
Vous pouvez stocker des valeurs dans des objets session et les extraire plus tard. D'abors, on va voir comment vous stocker des valeurs dans un objet de session:
// Obtenez l'objet HttpSession
HttpSession session = request.getSession();

// Supposons que l'utilisateur ait enregistré avec succès.
UserInfo loginedInfo = new UserInfo("Tom", "USA", 5);

// Stockez les informations de l'utilisateur dans un attribut (attribute) de Session.
// Vous pouvez récupérer ces informations à l'aide de la méthode getAttribute.
session.setAttribute(Constants.SESSION_USER_KEY, loginedInfo);
Et extraitez des informations stockées dans Session dans certaines pages.
// Obtenez l'objet HttpSession.
HttpSession session = request.getSession();

// Obtenez l'objet UserInfo qui a été stocké dans session
// après que l'utilisateur se connecte avec succès.
UserInfo loginedInfo 
    = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);
Observez l'exemple complet:
LoginServlet.java
package org.o7planning.tutorial.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.o7planning.tutorial.beans.Constants;
import org.o7planning.tutorial.beans.UserInfo;

@WebServlet(urlPatterns = { "/login" })
public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public LoginServlet() {
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		// Obtenez l'objet HttpSession
		HttpSession session = request.getSession();

		// Suppposons que l'utilisateur se soit connecte avec succès.
		UserInfo loginedInfo = new UserInfo("Tom", "USA", 5);

		// Stockez les informations de l'utilisateur dans un attribut (attribute) de Session.
		session.setAttribute(Constants.SESSION_USER_KEY, loginedInfo);

		out.println("<html>");
		out.println("<head><title>Session example</title></head>");

		out.println("<body>");
		out.println("<h3>You are logined!, info stored in session</h3>");

		out.println("<a href='userInfo'>View User Info</a>");
		out.println("</body>");
		out.println("<html>");
	}

}
UserInfoServlet.java
package org.o7planning.tutorial.servlet.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.o7planning.tutorial.beans.Constants;
import org.o7planning.tutorial.beans.UserInfo;

@WebServlet(urlPatterns = { "/userInfo" })
public class UserInfoServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public UserInfoServlet() {
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletOutputStream out = response.getOutputStream();

		// Obtenez l'objet HttpSession.
		HttpSession session = request.getSession();

		// Obtenez l'objet UserInfo qui a été stocké dans session
		// après que l'utilisateur se connecte avec succès.
		UserInfo loginedInfo = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);

		// S'il ne s'est pas connecté, Redirect (réorienter) vers la page de se connecter (LoginServlet).
		if (loginedInfo == null) {
			// ==> /ServletTutorial/login
			response.sendRedirect(this.getServletContext().getContextPath() + "/login");
			return;
		}

		out.println("<html>");
		out.println("<head><title>Session example</title></head>");

		out.println("<body>");

		out.println("<h3>User Info:</h3>");

		out.println("<p>User Name:" + loginedInfo.getUserName() + "</p>");
		out.println("<p>Country:" + loginedInfo.getCountry() + "</p>");
		out.println("<p>Post:" + loginedInfo.getPost() + "</p>");

		out.println("</body>");
		out.println("<html>");
	}

}
Exécutez l'exemple:

16- Le tutoriel Servlet-Filter

Ensuite, vous pouvez voir plus de documents sur  Servlet Filter (Filtrage de servlet):

17- Le tutoriel JSP

Etapes suivantes, vous pouvez voir Tutoriel sur  Servlet et  JSP ici:

View more Tutorials: