JEE 1 Servlet
JEE 1 Servlet
JEE 1 Servlet
JAVA EE
L’API Servlet
RequestDispatcher
Définition d'un objet qui permet le renvoi d'une requête vers
une autre ressource du serveur (une autre servlet, une JSP ...)
Méthode Rôle
Cette méthode est exécutée par le conteneur lorsque la servlet est
sollicitée : chaque requête du client déclenche une seule exécution de
void service (ServletRequest cette méthode.
req, ServletResponse res) Cette méthode pouvant être exécutée par plusieurs threads, il faut
prévoir un processus d'exclusion pour l'utilisation de certaines
ressources.
Initialisation de la servlet. Cette méthode est appelée une seule fois
après l'instanciation de la servlet.
void init(ServletConfig conf)
Aucun traitement ne peut être effectué par la servlet tant que
l'exécution de cette méthode n'est pas terminée.
ServletConfig
Renvoie l'objet ServletConfig passé à la méthode init
getServletConfig()
Cette méthode est appelée lors de la destruction de la servlet. Elle
void destroy() permet de libérer proprement certaines ressources (fichiers, bases de
données ...). C'est le serveur qui appelle cette méthode.
String getServletInfo() Renvoie des informations sur la servlet.
La requête et la réponse
18
Méthode Rôle
ServletInputStream getInputStream() Permet d'obtenir un flux pour les données de la requête
BufferedReader getReader() Idem
SetContentType Permet de préciser le type MIME de la réponse
ServletOutputStream
Permet d'obtenir un flux pour envoyer la réponse
getOutputStream()
PrintWriter getWriter() Permet d'obtenir un flux pour envoyer la réponse
Les servlets http
19
¨ L'usage principal des servlets est la création de pages HTML dynamiques. L'API fournit une
classe qui encapsule une servlet utilisant le protocole http. Cette classe est la classe
HttpServlet.
¨ Cette classe hérite de GenericServlet, donc elle implémente l'interface Servlet, et redéfinit
toutes les méthodes nécessaires pour fournir un niveau d'abstraction permettant de développer
facilement des servlets avec le protocole http.
¨ Ce type de servlet n'est pas utile seulement pour générer des pages HTML bien que cela soit
son principal usage, elle peut aussi réaliser un ensemble de traitements tels que mettre à jour
une base de données. En réponse, elle peut générer une page html qui indique le succès ou non
de la mise à jour. Une servlets peut aussi par exemple renvoyer une image qu'elle aura
dynamiquement générée en fonction de certains paramètres.
¨ Elle définit un ensemble de fonctionnalités très utiles : par exemple, elle contient une méthode
service() qui appelle certaines méthodes à redéfinir en fonction du type de requête http
(doGet(), doPost(), etc ...).
¨ La requête du client est encapsulée dans un objet qui implémente l'interface
HttpServletRequest : cet objet contient les données de la requête et des informations sur le
client.
Les servlets http
20
¨ Typiquement pour définir une servlet, il faut définir une classe qui hérite de la classe
HttpServlet et redéfinir la méthode doGet() et/ou doPost() selon les besoins.
¨ La méthode service() héritée de HttpServlet appelle l'une ou l'autre de ces méthodes
en fonction du type de la requête http :
¤ une requête GET : c'est une requête qui permet au client de demander une ressource
¤ une requête POST : c'est une requête qui permet au client d'envoyer des informations issues
par exemple d'un formulaire
¨ Une servlet peut traiter un ou plusieurs types de requêtes grâce à plusieurs autres
méthodes :
¤ doHead() : pour les requêtes http de type HEAD
¤ doPut() : pour les requêtes http de type PUT
¤ doDelete() : pour les requêtes http de type DELETE
¤ doOptions() : pour les requêtes http de type OPTIONS
¤ doTrace() : pour les requêtes http de type TRACE
¨ La classe HttpServlet hérite aussi de plusieurs méthodes définies dans l'interface
Servlet : init(), destroy() et getServletInfo().
Les servlets http
21
¨ init() : Cette méthode définie dans la classe HttpServlet sauvegarde l'objet de type
ServletConfig.
¤ Si cette méthode doit être redéfinie, il est important d'invoquer la méthode héritée avec un
appel à super.init(config), config étant l'objet fourni en paramètre de la méthode.
¨ service() : c’est la méthode qui est appelée lors de l'invocation de la servlet.
¤ Par défaut dans la classe HttpServlet, cette méthode contient du code qui réalise une
analyse de la requête client contenue dans l'objet HttpServletRequest. Selon le type de
requête GET ou POST, elle appelle la méthode doGet() ou doPost(). C'est bien le type de
requête qui indique la méthode à utiliser dans la servlet.
¤ Ainsi, la méthode service() n'est pas à redéfinir pour ces requêtes et il suffit de redéfinir
les méthodes doGet() et/ou doPost() selon les besoins.
¨ doGet() : Une requête de type GET est utile avec des liens.
¤ Dans une servlet de type HttpServlet, une telle requête est associée à la méthode doGet().
¤ Le traitement typique de la méthode doGet() est d'analyser les paramètres de la requête,
alimenter les données de l'en-tête de la réponse et d'écrire la réponse.
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
}
Les servlets http
23
¨ La
Méthode Rôle
Envoie une erreur avec un code retour et un
void sendError (int)
message par défaut
void sendError (int, Envoie une erreur avec un code retour et un
String) message
void Héritée de ServletResponse, cette méthode
setContentType(String) permet de préciser le type MIME de la réponse
void Héritée de ServletResponse, cette méthode
setContentLength(int) permet de préciser la longueur de la réponse
ServletOutputStream Héritée de ServletResponse, elle retourne un
getOutputStream() flux pour l'envoi de la réponse
Héritée de ServletResponse, elle retourne un
PrintWriter getWriter()
flux pour l'envoi de la réponse
HttpServletResponse
28
¨ Une servlet est une classe qui hérite de la classe HttpServlet et qui
redéfinit les méthodes du protocole HTTP.
¨ Si la méthode utilisée est GET, il suffit de redéfinir la méthode :
¤ public void doGet(
HttpServletRequest request,
HttpServletResponse response)
¨ Si la méthode utilisée est POST, il suffit de redéfinir la méthode :
¤ public void doPost(
HttpServletRequest request,
HttpServletResponse response)
¨ Si aucun traitement particulier n'est associé à une requête de type
POST, il est pratique de demander dans la méthode doPost()
d'exécuter la méthode doGet(). Dans ce cas, la servlet est capable
de renvoyer une réponse pour les deux types de requête.
Création d’une servlet
34
<servlet-mapping>
<servlet-name>DownloadFileServlet</servlet-name>
<url-pattern>/DownloadFileServlet</url-pattern>
</servlet-mapping>
</web-app>
Servlet : Chargement de fichiers
53
package com.ensas.jee.exemples.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/ResultMessage")
public class ResultMessage extends HttpServlet {
private static final long serialVersionUID = 1L;
¨ la méthode POST
¤ C’est généralement la méthode la plus fiable pour transmettre
des informations à un programme back-end.
¤ Elle regroupe les informations exactement de la même manière
que la méthode GET, mais au lieu de les envoyer sous forme de
chaîne de texte après un ? (point d'interrogation) dans l'URL,
elle les envoie dans un message séparé.
¤ Ce message est transmis au programme de gestion sous la
forme d'une entrée standard qu’on peut analyser et utiliser
pour traiter ces informations.
¤ La servlet traite ce type de requêtes en utilisant la méthode
doPost().
Servlet : Données du formulaire
64
package com.ensas.jee.exemples.servlets;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/GetPostMethodReadFormData")
public class GetPostMethodReadFormData extends HttpServlet {
private static final long serialVersionUID = 1L;
out.println("</body> </html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
}
Servlet : Données du formulaire
72
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>servlet-exemples-ReadFormData</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!--
<servlet>
<servlet-name>GetPostMethodReadFormData</servlet-name>
<servlet-
class>com.ensas.jee.exemples.servlets.GetPostMethodReadFormData</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetPostMethodReadFormData</servlet-name>
<url-pattern>/GetPostMethodReadFormData</url-pattern>
</servlet-mapping>
-->
</web-app>
Servlet : Chaînage
73
request MyHttpServlet1
2 MyHttpServlet2
1 service(...) {
service(...) {
// do something
// do something else
rd.include(…);
}
// do something
} 3
Client response
4
Servlet : Chaînage
(forward / sendRedirect)
75
MyHttpServlet1
request
service(...) {
1 // do something 2
MyHttpServlet2
rd.forward(…);
service(...) {
}
Client //do something else
response }
3
Servlet : Chaînage
(passage d’attributs)
76
¨ Pour rediriger les utilisateurs vers une autre page, on peut appeler la
méthode sendRedirect sur l'objet HttpServletResponse
¤ response.sendRedirect(String location)
¨ Techniquement, le serveur envoie un status code HTTP 302 (Moved
Temporarily) au client. Ensuite, le client effectue une redirection URL vers
l'emplacement spécifié.
¨ Le paramètre location dans la méthode sendRedirect() peut être un chemin
relatif ou une URL en chemin absolu:
¤ rediriger le client vers la page login.html relative au chemin du contexte de
l'application : response.sendRedirect("login.html");
¤ rediriger le client vers une page relative à la racine du contexte du serveur :
response.sendRedirect("/login.html");
¤ rediriger le client vers un autre site web :
response.sendRedirect("https://www.yoursite.com");
¨ L'appel à sendRedirect() doit être la dernière instruction dans le workflow.
cette méthode lance une IllegalStateException si elle est invoquée après que
la réponse a déjà été engagée via l’instruction writer.close().
Servlet : Chaînage
(transfert - forward)
78
¨ Pour transmettre une requête d’une servlet à une page de destination HTML :
¤ Tout d'abord, dans la méthode doGet() / doPost() de la servlet, obtenir une
référence de RequestDispatcher à partir de la requête, en passant la page de
destination. Par exemple:
String destination = "result.html";
RequestDispatcher requestDispatcher = request.getRequestDispatcher(destination);
Request
LoginServlet
Response
AddCarServlet
Authenticate
Audit Filter
Filter
EditCarServlet
LogoutServlet
Les Filtres
82
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain)
throws IOException, ServletException {
// invoqué lorsqu'une requête correspondante est envoyée au serveur
// utilisé pour intercepter la requête et traiter la réponse
chain.doFilter(request, response); // invoque le filtre suivant dans la chaîne
}
}
Les Filtres : paramètres
86
d'initialisation
¨ On peut spécifier les paramètres d'initialisation du filtre
dans le descripteur de déploiement (web.xml) comme ceci :
<filter>
<filter-name>Hello Filter</filter-name>
<filter-class>com.ensas.jee.exemples.servlets.HelloFilter</filter-class>
<init-param>
<param-name>message</param-name>
<param-value>A message from Hello Filter</param-value>
</init-param>
<init-param>
<param-name>threshold</param-name>
<param-value>1024</param-value>
</init-param>
</filter>
¨ On doit préciser le nom du filtre et son nom de classe
complètement qualifié.
Les Filtres : paramètres
87
d'initialisation
¨ On peut spécifier autant de paramètres qu’on le souhaite.
¨ Ensuite, dans la méthode init() du filtre, on peut lire ces
paramètres d'initialisation via l'objet FilterConfig comme ceci :
¨ Les cookies sont des fichiers contenant des données au format texte.
¨ Ils sont créés à l'initiative du serveur et envoyés par le serveur sur le
poste client pour leur stockage.
¨ Les données contenues dans le cookie sont ensuite renvoyées au
serveur à chaque requête.
¨ Les cookies peuvent être utilisés explicitement ou implicitement par
exemple lors de l'utilisation d'une session.
¨ Les cookies ne sont pas dangereux car ce sont uniquement des
fichiers textes qui ne sont pas exécutés.
¨ Par contre les cookies peuvent contenir des données plus ou moins
sensibles.
¨ Il est capital de ne stocker dans les cookies que des données qui ne
sont pas facilement exploitables par une intervention humaine sur le
poste client et en tout cas de ne jamais les utiliser pour stocker des
informations sensibles telles qu'un numéro de carte bancaire.
Cookies
92
Attribut Rôle
Comment Commentaire associé au cookie
Nom de domaine (partiel ou complet) associé au cookie. Seuls les serveurs contenant ce
Domain
nom de domaine recevront le cookie
Durée de vie en secondes du cookie. Une fois ce délai expiré, le cookie est détruit sur le
MaxAge poste client par le navigateur. Par défaut la valeur limite la durée de vie du cookie à la
durée de vie de l'exécution du navigateur
Name Nom du cookie
Chemin du cookie. Ce chemin permet de renvoyer le cookie uniquement au serveur dont
l'url contient également le chemin. Par défaut, cet attribut contient le chemin de l'url de la
Path
servlet. Par exemple, pour que le cookie soit renvoyé à toutes les requêtes du serveur, il
suffit d'affecter la valeur "/" à cet attribut
Secure Booléen qui précise si le cookie ne doit être envoyé que par une connexion SSL
Value Valeur associée au cookie
Version Version du protocole utilisé pour gérer le cookie
Cookies
95
Cookies : création
96
package com.ensas.jee.exemples.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
//@WebServlet("/add_cookies")
public class AddCookiesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int cookieCount;
<servlet>
<servlet-name>addCookiesServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.AddCookiesServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>readCookiesServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.ReadCookiesServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>deleteCookiesServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.DeleteCookiesServlet</servlet-class>
</servlet>
Cookies : exemple
109
<servlet-mapping>
<servlet-name>addCookiesServlet</servlet-name>
<url-pattern>/add_cookies</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>readCookiesServlet</servlet-name>
<url-pattern>/read_cookies</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>deleteCookiesServlet</servlet-name>
<url-pattern>/delete_cookies</url-pattern>
</servlet-mapping>
</web-app>
Les sessions
110
¨ une session indique une période de temps pendant laquelle un utilisateur unique visite
un site web.
¨ Une session commence lorsque l'utilisateur demande la première page. Et pendant
une session, l'utilisateur peut consulter autant de pages qu'il le souhaite.
¨ La session se termine si l'utilisateur n'a pas demandé de pages pendant un certain
temps (timeout).
¨ Le délai d'expiration de la session varie en fonction de la configuration du serveur -
généralement entre 15 et 30 minutes.
¨ Le protocole HTTP étant sans état, le serveur peut suivre la session grâce à des
cookies, à la réécriture d'URL ou à des champs de formulaire cachés - pour identifier
un utilisateur unique à travers différentes requêtes.
¨ Le suivi des sessions à l'aide de cookies est le principal mécanisme.
¨ Si le navigateur web de l'utilisateur ne prend pas en charge les cookies, il est
possible d'utiliser la réécriture d'URL ou des champs de formulaire cachés.
¨ Dans le développement web, les programmeurs utilisent le mécanisme de session pour
gérer les informations de l'utilisateur qui ne persistent que dans une session
particulière, telles que l'état d'authentification, le nom d'utilisateur ou toute donnée
devant être partagée entre plusieurs requêtes.
Les sessions
111
package com.ensas.jee.exemples.servlets;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/test_session")
public class TestSessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestSessionServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
PrintWriter writer = response.getWriter();
writer.println("Session ID: " + session.getId());
writer.println("Creation Time: " + new Date(session.getCreationTime()));
writer. println("Last Accessed Time: " + new Date(session.getLastAccessedTime()));
}
}
Les servlets : gestion d'erreurs
119
package com.ensas.jee.exemples.servlets;
@WebServlet("/ServletThrowableException")
public class ServletIOException extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
throw new ServletException();
}
}
Les servlets : Exercice(JDBC)
126
¨ Créer une application web pour tester les opérations CRUD sur une base de donnée (JDBC).
Les servlets : Exercice(JDBC)
127
Les servlets : Exercice(JDBC)
128
Les servlets : Exercice(JDBC)
129
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>servlet-exemple-JDBC-CRUD</display-name>
<welcome-file-list> <welcome-file>ControllerServlet</welcome-file> </welcome-file-list>
<context-param>
<param-name>jdbcURL</param-name>
<param-value>jdbc:mysql://localhost:3306/BookStore</param-value>
</context-param>
<context-param>
<param-name>jdbcUsername</param-name>
<param-value>username</param-value>
</context-param>
<context-param>
<param-name>jdbcPassword</param-name>
<param-value>password</param-value>
</context-param>
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>com.ensas.jee.exemples.servlets.controller.ControllerServlet</servlet-class>
</servlet>
Les servlets : Exercice(JDBC)
130
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/Error</location>
</error-page>
</web-app>
package com.ensas.jee.exemples.servlets.model;
public class Book {
protected int id;
protected String title;
protected String author;
protected float price;
public Book() {}
public Book(int id, String title, String author, float price) {
this(title, author, price); this.id = id;
}
public Book(String title, String author, float price) {
this.title = title; this.author = author; this.price = price;
}
Les servlets : Exercice(JDBC)
131
public int getId() { return id;
}
public void setId(int id) { this.id = id;
}
public String getTitle() { return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
Les servlets : Exercice(JDBC)
132
package com.ensas.jee.exemples.servlets.dao;
import java.sql.*;
import java.util.*;
import com.ensas.jee.exemples.servlets.model.Book;
public class BookDAO {
private String jdbcURL;
private String jdbcUsername;
private String jdbcPassword;
private Connection jdbcConnection;
public BookDAO(String jdbcURL, String jdbcUsername, String jdbcPassword) {
this.jdbcURL = jdbcURL;
this.jdbcUsername = jdbcUsername;
this.jdbcPassword = jdbcPassword;
}
protected void connect() throws SQLException {
if (jdbcConnection == null || jdbcConnection.isClosed()) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new SQLException(e);
}
jdbcConnection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
}
}
Les servlets : Exercice(JDBC)
133
protected void disconnect() throws SQLException {
if (jdbcConnection != null && !jdbcConnection.isClosed()) jdbcConnection.close();
}
public List<Book> listAllBooks() throws SQLException {
List<Book> listBook = new ArrayList<>();
String sql = "SELECT * FROM book";
connect();
Statement statement = jdbcConnection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("book_id");
String title = resultSet.getString("title");
String author = resultSet.getString("author");
float price = resultSet.getFloat("price");
Book book = new Book(id, title, author, price);
listBook.add(book);
}
resultSet.close();
statement.close();
disconnect();
return listBook;
}
Les servlets : Exercice(JDBC)
134
public boolean insertBook(Book book) throws SQLException {
String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)";
connect();
PreparedStatement statement = jdbcConnection.prepareStatement(sql);
statement.setString(1, book.getTitle());
statement.setString(2, book.getAuthor());
statement.setFloat(3, book.getPrice());
boolean rowInserted = statement.executeUpdate() > 0;
statement.close();
disconnect();
return rowInserted;
}
public boolean deleteBook(Book book) throws SQLException {
String sql = "DELETE FROM book where book_id = ?";
connect();
PreparedStatement statement = jdbcConnection.prepareStatement(sql);
statement.setInt(1, book.getId());
boolean rowDeleted = statement.executeUpdate() > 0;
statement.close();
disconnect();
return rowDeleted;
}
Les servlets : Exercice(JDBC)
135
out.println("<h1>Books Management</h1>");
out.println("<h2>");
out.println("<a href=\"new\">Add New Book</a>");
out.println(" "); //espace horizontal
out.println("<a href=\"list\">List All Books</a>");
out.println("</h2>");
out.println("<div >");
Book book=(Book) request.getAttribute("book");
if (book != null) out.println("<form action=\"update\" method=\"post\">");
if (book == null) out.println("<form action=\"insert\" method=\"post\">");
out.println("<table border=\"1\" cellpadding=\"5\">");
out.println("<caption><h2>");
if (book != null) out.println("Edit Book");
if (book == null) out.println("Add New Book");
out.println("</h2></caption>");
if (book != null) {
out.println("<input type=\"hidden\" name=\"id\" value=\""+book.getId()+"\"/>");
out.println("<tr><th>Title:</th> ");
out.println("<td><input type=\"text\" name=\"title\" size=\"45\" value=\""+book.getTitle()+"\"/>");
out.println("</td></tr>");
out.println("<tr><th>Author:</th></tr>");
Les servlets : Exercice(JDBC)
146
out.println("<tr><th>Author:</th><td>");
out.println("<input type=\"text\" name=\"author\" size=\"45\" value=\""+book.getAuthor()+"\"/>");
out.println("</td></tr>");
out.println("<tr><th>Price:</th>");
out.println("<td><input type=\"text\" name=\"price\" size=\"5\" value=\""+book.getPrice()+"\"/>");
out.println("</td></tr>");
} else {
out.println("<input type=\"hidden\" name=\"id\" value=\"\"/>");
out.println("<tr><th>Title:</th>");
out.println("<td><input type=\"text\" name=\"title\" size=\"45\" value=\"\" /></td></tr>");
out.println("<tr><th>Author:</th>");
out.println("<td><input type=\"text\" name=\"author\" size=\"45\" value=\"\" /></td></tr>");
out.println("<tr><th>Price:</th>");
out.println("<td><input type=\"text\" name=\"price\" size=\"5\" value=\"\" /></td></tr>");
}
out.println("<tr> <td colspan=\"2\" align=\"center\"><input type=\"submit\" value=\"Save\"/> ");
out.println("</td></tr></table>");
out.println("</form></div>");
out.println("</body>");
out.println("</html>");
}
}
Les servlets : Exercice(JDBC)
147
package com.ensas.jee.exemples.servlets.view;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/Error")
public class ErrorServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Error</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Error</h1>");
Les servlets : Exercice(JDBC)
148
out.println("<h2>");
//Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");
//String servletName = (String)request.getAttribute("javax.servlet.error.servlet_name");
//String requestUri = (String)request.getAttribute("javax.servlet.error.request_uri");
// Analyze the servlet exception
Throwable exception = (Throwable)request.getAttribute("javax.servlet.error.exception");
out.println(exception.getMessage());
out.println("</h2>");
out.println("</body>");
out.println("</html>");
}
}