Table des matières
- Introduction
- Le principe lors de la programmation Servlet + JSP
- L'aperçu Demo de l'application Web fera
- Préparer la base de données
- Créer le Projet de WebApp
- La configuration de l'environnement d'exécution (Runtime Environment)
- Exécuter l'application pour la première fois
- Télécharger et déclarer la bibliothèque JDBC
- Télécharger et déclarer la bibliothèque JSTL
- Des classes javabeans sont simulées dans la base de données
- Des classes utilitaires de connexion à la base de données
- La classe utilitaire et la manipulation des données
- Créer Servlet Filter pour connecter à la base de données
- Le Servlet Filter lit des Cookies pour se connecter automatiquement
- EncodingFilter Servlet
- Des pages réutilisées
- La page d'accueil
- La page de connexion - LoginServlet
- La page de la liste des produits
- Add Product Page
- La page de modifier du produit
- Effacer le produit
Créer une application Web Java simple à l'aide de Servlet, JSP et JDBC
View more Tutorials:
- Introduction
- Le principe lors de la programmation Servlet + JSP
- L'aperçu Demo de l'application Web fera
- Préparer la base de données
- Créer le Projet de WebApp
- La configuration de l'environnement d'exécution (Runtime Environment)
- Exécuter l'application pour la première fois
- Télécharger et déclarer la bibliothèque JDBC
- Télécharger et déclarer la bibliothèque JSTL
- Des classes javabeans sont simulées dans la base de données
- Des classes utilitaires de connexion à la base de données
- La classe utilitaire et la manipulation des données
- Créer Servlet Filter pour connecter à la base de données
- Le Servlet Filter lit des Cookies pour se connecter automatiquement
- EncodingFilter Servlet
- Des pages réutilisées
- La page d'accueil
- La page de connexion - LoginServlet
- La page de la liste des produits
- Add Product Page
- La page de modifier du produit
- Effacer le produit

Le document est basé sur:
-
Eclipse 4.5 MARS
-
Tomcat 8.x
Dans ce document, je vais vous guider pas à pas comment créer une application web en combinaison de Servlet + JSP + Filter + JSP EL + JDBC. Assurez vous que vous maitrisez Servlet, JSP và Filter et JDBC avant de démarrer. Si non, vous pouvez faire référence à:
Servlet:
Servlet Filter:
JSP:
La bibliothèque des tag de JSP (JSTL)
JDBC
Remarque: Dans ce document, j'introduis seulement de la fonction de "Login" et celle de "Remember Me". Et ne gérez pas la sécurité des pages. Si vous souhaitez avoir une application,sécurisez chaque page, veuillez vous référer à l'article ci-dessous:
Ce sont les principes que vous devez garder à l'esprit qu'une application web qui est construit en utilisant Servlet + JSP doit satisfaire des critères suivants: le code est simple, facile de comprendre et facile de maintenir.
Les principes:
- Ne permet jamais des utilisateurs d'accéder directement à votre page JSP.
- La page JSP n' est qu'une interface de la présentation.
- Servlet joue le rôle comme le contrôleur des flots d'application et le programme de traitement logique.
- Ouvrez la connection JDBC et la gestion des transactions dans le filtre (facultatif).
Selon le principe 1:
Ne permettez jamais des utilisateurs d'accéder directement à votre page JSP. Cela signifie que toutes les requêtes des utilisateurs sont:
- Une autre source de la base de données statique (image, css, js,...)
- Ou une servlet.

Quand l'utilisateur requête à une Servlet, il va disposer des besoins de l'utilisateur, comme Insert, update et requêter les données, et finalement les transmettre (forward) à la page JSP pour afficher les données. Donc chaque servlet a 0 hoặc ou multiple pages JSP correspondantes (Normalement une seule est suffisante).
Principle 2:
JSP est uniquement considérée comme le lieu d'exposer des données, cela signifie que vous ne devez pas traiter l'application logique sur la page JSP, par exemple comme mettre à jour (update), insérer (insert), supprimer (delete),.., et ne naviguez pas sur la page JSP.
Vous pouvez prévisualiser la démo (Demo) de l'application web va faire:
Dans ce document, je vous donne des instructions avec 3 bases de données Oracle, MySQL ou SQL Server. Vous devez exécuter des script pour créer quelques pages et des données nécessaires dans cet exemple.
ORACLE:
-- Create table create table USER_ACCOUNT ( USER_NAME VARCHAR2(30) not null, GENDER VARCHAR2(1) not null, PASSWORD VARCHAR2(30) not null, primary key (USER_NAME) ); -- Create table create table PRODUCT ( CODE VARCHAR2(20) not null, NAME VARCHAR2(128) not null, PRICE FLOAT not null, primary key (CODE) ) ; -- Insert data: --------------------------------------------------------------- insert into user_account (USER_NAME, GENDER, PASSWORD) values ('tom', 'M', 'tom001'); insert into user_account (USER_NAME, GENDER, PASSWORD) values ('jerry', 'M', 'jerry001'); insert into product (CODE, NAME, PRICE) values ('P001', 'Java Core', 100); insert into product (CODE, NAME, PRICE) values ('P002', 'C# Core', 90); -- Commit Commit;
MYSQL:
-- Create table create table USER_ACCOUNT ( USER_NAME VARCHAR(30) not null, GENDER VARCHAR(1) not null, PASSWORD VARCHAR(30) not null, primary key (USER_NAME) ); -- Create table create table PRODUCT ( CODE VARCHAR(20) not null, NAME VARCHAR(128) not null, PRICE FLOAT not null, primary key (CODE) ) ; -- Insert data: --------------------------------------------------------------- insert into user_account (USER_NAME, GENDER, PASSWORD) values ('tom', 'M', 'tom001'); insert into user_account (USER_NAME, GENDER, PASSWORD) values ('jerry', 'M', 'jerry001'); insert into product (CODE, NAME, PRICE) values ('P001', 'Java Core', 100); insert into product (CODE, NAME, PRICE) values ('P002', 'C# Core', 90);
SQL SERVER:
-- Create table create table USER_ACCOUNT ( USER_NAME VARCHAR(30) not null, GENDER VARCHAR(1) not null, PASSWORD VARCHAR(30) not null, primary key (USER_NAME) ); -- Create table create table PRODUCT ( CODE VARCHAR(20) not null, NAME VARCHAR(128) not null, PRICE FLOAT not null, primary key (CODE) ) ; -- Insert data: --------------------------------------------------------------- insert into user_account (USER_NAME, GENDER, PASSWORD) values ('tom', 'M', 'tom001'); insert into user_account (USER_NAME, GENDER, PASSWORD) values ('jerry', 'M', 'jerry001'); insert into product (CODE, NAME, PRICE) values ('P001', 'Java Core', 100); insert into product (CODE, NAME, PRICE) values ('P002', 'C# Core', 90);
Dans Eclipse sélectionnez:
- File/New/Other...




Le projet est créé.

Ajoutez le fichier index.html

index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Simple Web Application</title> </head> <body> <h2>Simple Login Web Application using JSP/Servlet</h2> <ul> <li><a href="home">Home</a></li> <li><a href="login">Login</a></li> <li><a href="productList">Product List</a> </ul> </body> </html>
LL'application a besoin d'exécuter sur un serveur web (WebServer), par exemple Tomcat Server, vous pouvez faire référence au document de téléchargement et de déclaration du Server Tomcat dans Eclipse à:
Cliquez sur le bouton droit SimpleWebApp sélectionnez Properties.




Cliquez sur le bouton droit du projet SimpleWebApp, sélectionnez:
- Run As/Run on Server



L'application a été exécutée:

OK, jusqu'ici tout va bien. Nous allons commencer à programmer une application web réelle.
Vous devez télécharger la bibliothèque JDBC pour conduire la connexion avec la base de données. Dans ce document, je télécharge toutes les 3 bibliothèques JDBC pour Oracle, MySQL, SQL Server, en pratique, vous avez seulement besoin de la bibliothèque JDBC correspondante au type de la base de données que vous utilisez.
Vous pouvez voir le téléchargement de JDBC driver à:
Ou télécharger les bibliothèques JDBC pour MySQL, Sql Server, Oracle ici:
- some-jdbc-drivers.zip (MySQL + SQL Server + Oracle) o7planning link.
Les résultats sont téléchargés:

Copiez ces bibliothèque dans WEB-INF/lib:

Vous devez télécharger 2 bibliothèques JSTL pour les utiliser dans JSP:
- javax.servlet.jsp.jstl-*.jar
- javax.servlet.jsp.jslt-api-*.jar


Copiez 2 fichier jar que vous venez de télécharger dans la bibliothèque /WEB-INF/lib:

Créez 2 classes Javabean, chaque classes est simulée une table dans la base de données:

UserAccount.java
package org.o7planning.simplewebapp.beans; public class UserAccount { public static final String GENDER_MALE ="M"; public static final String GENDER_FEMALE = "F"; private String userName; private String gender; private String password; public UserAccount() { } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
Product.java
package org.o7planning.simplewebapp.beans; public class Product { private String code; private String name; private float price; public Product() { } public Product(String code, String name, float price) { this.code = code; this.name = name; this.price = price; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }

MySQLConnUtils.java
package org.o7planning.simplewebapp.conn; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MySQLConnUtils { public static Connection getMySQLConnection() throws ClassNotFoundException, SQLException { // Remarque: Modifiez les paramètres de connexion en conséquence. String hostName = "localhost"; String dbName = "mytest"; String userName = "root"; String password = "12345"; return getMySQLConnection(hostName, dbName, userName, password); } public static Connection getMySQLConnection(String hostName, String dbName, String userName, String password) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); // La structure de URL Connection pour MySQL: // Exemple: // jdbc:mysql://localhost:3306/simplehr String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
OracleConnUtils.java
package org.o7planning.simplewebapp.conn; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OracleConnUtils { public static Connection getOracleConnection() throws ClassNotFoundException, SQLException { // Remarque: Modifiez les paramètres de connexion en conséquence. String hostName = "localhost"; String sid = "db12c"; String userName = "mytest"; String password = "12345"; return getOracleConnection(hostName, sid, userName, password); } public static Connection getOracleConnection(String hostName, String sid, String userName, String password) throws ClassNotFoundException, SQLException { Class.forName("oracle.jdbc.driver.OracleDriver"); // La structure de URL Connection pour Oracle // Exemple: // jdbc:oracle:thin:@localhost:1521:db11g // jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME String connectionURL = "jdbc:oracle:thin:@" + hostName + ":1521:" + sid; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
SQLServerConnUtils_JTDS.java
package org.o7planning.simplewebapp.conn; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLServerConnUtils_JTDS { // Connectez- vous au SQLServer. // (Utilisant le driver JDBC de la bibliothèque JTDS) public static Connection getSQLServerConnection_JTDS() // throws SQLException, ClassNotFoundException { // Remarque: Modifiez les paramètres de connexion en conséquence. String hostName = "localhost"; String sqlInstanceName = "SQLEXPRESS"; String database = "mytest"; String userName = "sa"; String password = "12345"; return getSQLServerConnection_JTDS(hostName, sqlInstanceName, database, userName, password); } // Connectez- vous au SQL Server en utilisant la bibliothèque JTDS. private static Connection getSQLServerConnection_JTDS(String hostName, // String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException { Class.forName("net.sourceforge.jtds.jdbc.Driver"); // La structure de URL Connection pour SQL Server: // Exemple: // jdbc:jtds:sqlserver://localhost:1433/simplehr;instance=SQLEXPRESS String connectionURL = "jdbc:jtds:sqlserver://" + hostName + ":1433/" // + database + ";instance=" + sqlInstanceName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
SQLServerConnUtils_SQLJDBC.java
package org.o7planning.simplewebapp.conn; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLServerConnUtils_SQLJDBC { // Connectez- vous au SQL Server. // (Utilisant la bibliothèque SQLJDBC) public static Connection getSQLServerConnection_SQLJDBC() // throws ClassNotFoundException, SQLException { // Remarque: Modifiez les paramètres de connexion en conséquence. String hostName = "localhost"; String sqlInstanceName = "SQLEXPRESS"; String database = "mytest"; String userName = "sa"; String password = "12345"; return getSQLServerConnection_SQLJDBC(hostName, sqlInstanceName, database, userName, password); } // Connectez- vous au SQLServer, en utilisant la bibliothèque SQLJDBC. private static Connection getSQLServerConnection_SQLJDBC(String hostName, // String sqlInstanceName, String database, String userName, String password)// throws ClassNotFoundException, SQLException { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // La structure URL Connection pour SQLServer // Exemple: // jdbc:sqlserver://ServerIp:1433/SQLEXPRESS;databaseName=simplehr String connectionURL = "jdbc:sqlserver://" + hostName + ":1433" // + ";instance=" + sqlInstanceName + ";databaseName=" + database; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
ConnectionUtils.java
package org.o7planning.simplewebapp.conn; import java.sql.Connection; import java.sql.SQLException; public class ConnectionUtils { public static Connection getConnection() throws ClassNotFoundException, SQLException { // Ici, je me connecte à l'Oracle Database. // (Vous pouvez également utiliser d'autre base de données). return OracleConnUtils.getOracleConnection(); // return OracleConnUtils.getOracleConnection(); // return MySQLConnUtils.getMySQLConnection(); // return SQLServerConnUtils_JTDS.getSQLServerConnection_JTDS(); // return SQLServerConnUtils_SQLJDBC.getSQLServerConnection_SQLJDBC(); // return PostGresConnUtils.getPostGresConnection(); } public static void closeQuietly(Connection conn) { try { conn.close(); } catch (Exception e) { } } public static void rollbackQuietly(Connection conn) { try { conn.rollback(); } catch (Exception e) { } } }

MyUtils.java
package org.o7planning.simplewebapp.utils; import java.sql.Connection; import javax.servlet.ServletRequest; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.o7planning.simplewebapp.beans.UserAccount; public class MyUtils { public static final String ATT_NAME_CONNECTION = "ATTRIBUTE_FOR_CONNECTION"; private static final String ATT_NAME_USER_NAME = "ATTRIBUTE_FOR_STORE_USER_NAME_IN_COOKIE"; // Sockez Connection dans l'attribut de la demande. // Les informations stockées n'existent que pendant les demandes (request) // jusqu'à quand des données sont envoyées au navigateur de l'utilisateur. public static void storeConnection(ServletRequest request, Connection conn) { request.setAttribute(ATT_NAME_CONNECTION, conn); } // L'objet de connexion a été enregistré dans l'attribut de la demande. public static Connection getStoredConnection(ServletRequest request) { Connection conn = (Connection) request.getAttribute(ATT_NAME_CONNECTION); return conn; } // Conservez les informations de l'utilisateur en Session. public static void storeLoginedUser(HttpSession session, UserAccount loginedUser) { // Sur JSP l'utilisateur peut accéder via ${loginedUser} session.setAttribute("loginedUser", loginedUser); } // Obtenez les informations de l'utilisateur stockées dans la Session. public static UserAccount getLoginedUser(HttpSession session) { UserAccount loginedUser = (UserAccount) session.getAttribute("loginedUser"); return loginedUser; } // Stockez les informations de l'utilisateur dans Cookie. public static void storeUserCookie(HttpServletResponse response, UserAccount user) { System.out.println("Store user cookie"); Cookie cookieUserName = new Cookie(ATT_NAME_USER_NAME, user.getUserName()); // 1 jour (converti en secondes) cookieUserName.setMaxAge(24 * 60 * 60); response.addCookie(cookieUserName); } public static String getUserNameInCookie(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (ATT_NAME_USER_NAME.equals(cookie.getName())) { return cookie.getValue(); } } } return null; } // Supprimez les cookies de l'utilisateur. public static void deleteUserCookie(HttpServletResponse response) { Cookie cookieUserName = new Cookie(ATT_NAME_USER_NAME, null); // 0 seconde. (ce cookie expirera immédiatement) cookieUserName.setMaxAge(0); response.addCookie(cookieUserName); } }
DBUtils.java
package org.o7planning.simplewebapp.utils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.o7planning.simplewebapp.beans.Product; import org.o7planning.simplewebapp.beans.UserAccount; public class DBUtils { public static UserAccount findUser(Connection conn, // String userName, String password) throws SQLException { String sql = "Select a.User_Name, a.Password, a.Gender from User_Account a " // + " where a.User_Name = ? and a.password= ?"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, userName); pstm.setString(2, password); ResultSet rs = pstm.executeQuery(); if (rs.next()) { String gender = rs.getString("Gender"); UserAccount user = new UserAccount(); user.setUserName(userName); user.setPassword(password); user.setGender(gender); return user; } return null; } public static UserAccount findUser(Connection conn, String userName) throws SQLException { String sql = "Select a.User_Name, a.Password, a.Gender from User_Account a "// + " where a.User_Name = ? "; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, userName); ResultSet rs = pstm.executeQuery(); if (rs.next()) { String password = rs.getString("Password"); String gender = rs.getString("Gender"); UserAccount user = new UserAccount(); user.setUserName(userName); user.setPassword(password); user.setGender(gender); return user; } return null; } public static List<Product> queryProduct(Connection conn) throws SQLException { String sql = "Select a.Code, a.Name, a.Price from Product a "; PreparedStatement pstm = conn.prepareStatement(sql); ResultSet rs = pstm.executeQuery(); List<Product> list = new ArrayList<Product>(); while (rs.next()) { String code = rs.getString("Code"); String name = rs.getString("Name"); float price = rs.getFloat("Price"); Product product = new Product(); product.setCode(code); product.setName(name); product.setPrice(price); list.add(product); } return list; } public static Product findProduct(Connection conn, String code) throws SQLException { String sql = "Select a.Code, a.Name, a.Price from Product a where a.Code=?"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, code); ResultSet rs = pstm.executeQuery(); while (rs.next()) { String name = rs.getString("Name"); float price = rs.getFloat("Price"); Product product = new Product(code, name, price); return product; } return null; } public static void updateProduct(Connection conn, Product product) throws SQLException { String sql = "Update Product set Name =?, Price=? where Code=? "; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, product.getName()); pstm.setFloat(2, product.getPrice()); pstm.setString(3, product.getCode()); pstm.executeUpdate(); } public static void insertProduct(Connection conn, Product product) throws SQLException { String sql = "Insert into Product(Code, Name,Price) values (?,?,?)"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, product.getCode()); pstm.setString(2, product.getName()); pstm.setFloat(3, product.getPrice()); pstm.executeUpdate(); } public static void deleteProduct(Connection conn, String code) throws SQLException { String sql = "Delete From Product where Code= ?"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, code); pstm.executeUpdate(); } }
Dans JDBCFilter, j'ai vérifié si des requêtes sont actuellement référées par une Servlet, de manière à ce que vous voyez la photo ci- dessous afin de le trouver facile à commprendre. La photo décrit la relation entre des concepts de Servlet.

JDBCFilter avec la déclaration url-pattern = /*, cela signifie que toutes les requête des utilisateurs doivent traverser ce filtre. JDBCFilter va vérifier la requête pour assurer que'il ouvre uniquement la connexion JDBC pour des requêtes nécessaires, par exemple, pour Servlet, évitez d'ouvrir la connexion JDBC pour les requêtes générales comme image, css, js, html.
JDBCFilter.java
package org.o7planning.simplewebapp.filter; import java.io.IOException; import java.sql.Connection; import java.util.Collection; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import org.o7planning.simplewebapp.conn.ConnectionUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebFilter(filterName = "jdbcFilter", urlPatterns = { "/*" }) public class JDBCFilter implements Filter { public JDBCFilter() { } @Override public void init(FilterConfig fConfig) throws ServletException { } @Override public void destroy() { } // Vérifiez que la cible de la requête est une servlet?? private boolean needJDBC(HttpServletRequest request) { System.out.println("JDBC Filter"); // // Servlet Url-pattern: /spath/* // // => /spath String servletPath = request.getServletPath(); // => /abc/mnp String pathInfo = request.getPathInfo(); String urlPattern = servletPath; if (pathInfo != null) { // => /spath/* urlPattern = servletPath + "/*"; } // Key: servletName. // Value: ServletRegistration Map<String, ? extends ServletRegistration> servletRegistrations = request.getServletContext() .getServletRegistrations(); // La collection de tous les servlets dans votre Webapp. Collection<? extends ServletRegistration> values = servletRegistrations.values(); for (ServletRegistration sr : values) { Collection<String> mappings = sr.getMappings(); if (mappings.contains(urlPattern)) { return true; } } return false; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; // N'ouvrez que connection (la connexion) pour des demandes ayant des chemins spéciaux. // (Par exemple: Des chemins vont vers servlet, jsp, ..) // Évitez d'ouvrir Connection pour des demandes demandes normales. // (Par exemple: image, css, javascript,... ) if (this.needJDBC(req)) { System.out.println("Open Connection for: " + req.getServletPath()); Connection conn = null; try { // Créez des objets Connection se connecte à la base de données. conn = ConnectionUtils.getConnection(); // Définissez automatiquement commit false. conn.setAutoCommit(false); // Enregistrez l'objet Connection dans l'attribut de la demande. MyUtils.storeConnection(request, conn); // Autorisez la demande d'aller en avant. // (Allez au filtre suivant ou à la cible). chain.doFilter(request, response); // Appelez la méthode commit() pour finir la transaction avec DB. conn.commit(); } catch (Exception e) { e.printStackTrace(); ConnectionUtils.rollbackQuietly(conn); throw new ServletException(); } finally { ConnectionUtils.closeQuietly(conn); } } // Pour des demandes communes (image,css,html,..) // ce n'est pas obligatoire d'ouvrir connection. else { // Permettez la demande d'aller en avant. // (Allez au filtre suivant ou à la cible). chain.doFilter(request, response); } } }
Au cas où l'utilisateur est connecté et s'est souvient l'information dans l'accès précédent (par exempl le jour précédent). Et maintenant l'utilisateur revient, ce Filter va vérifier l'information de Cookie stockée par le navaigateur et la connexion Login.
CookieFilter.java
package org.o7planning.simplewebapp.filter; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.o7planning.simplewebapp.beans.UserAccount; import org.o7planning.simplewebapp.utils.DBUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebFilter(filterName = "cookieFilter", urlPatterns = { "/*" }) public class CookieFilter implements Filter { public CookieFilter() { } @Override public void init(FilterConfig fConfig) throws ServletException { } @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpSession session = req.getSession(); UserAccount userInSession = MyUtils.getLoginedUser(session); // if (userInSession != null) { session.setAttribute("COOKIE_CHECKED", "CHECKED"); chain.doFilter(request, response); return; } // La Connecxion a été créée dans JDBCFilter. Connection conn = MyUtils.getStoredConnection(request); // Le drapeau (flag) sert à vérifier Cookie. String checked = (String) session.getAttribute("COOKIE_CHECKED"); if (checked == null && conn != null) { String userName = MyUtils.getUserNameInCookie(req); try { UserAccount user = DBUtils.findUser(conn, userName); MyUtils.storeLoginedUser(session, user); } catch (SQLException e) { e.printStackTrace(); } // Marquez qu'il a vérifié Cookie. session.setAttribute("COOKIE_CHECKED", "CHECKED"); } chain.doFilter(request, response); } }
REMARQUE:JDBCFilter & CookieFilter ont la même déclaration url-pattern =/*, vous devez configurer pour assurer que JDBCFilter est exécuté d'abord. Par conséquent, vous devez déclarer l'ordre dans web.xml (Il n'y a aucun cas pour déclarer l'ordre par annotation).
<filter-mapping> <filter-name>jdbcFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>cookieFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
See full web.xml:
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>SimpleWebApp</display-name> <filter-mapping> <filter-name>jdbcFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>cookieFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>home</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
EncodingFilter.java
package org.o7planning.simplewebapp.filter; import java.io.IOException; import java.sql.Connection; import java.util.Collection; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import org.o7planning.simplewebapp.conn.ConnectionUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebFilter(filterName = "encodingFilter", urlPatterns = { "/*" }) public class EncodingFilter implements Filter { public EncodingFilter() { } @Override public void init(FilterConfig fConfig) throws ServletException { } @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } }
Quelques pages JSP vont être utilisées pour intégrerr dans différente page, à l'exécution, à travers l'utilisation de:
<jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <jsp:include page="_footer.jsp"></jsp:include>

/WEB-INF/views/_header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <div style="background: #E0E0E0; height: 55px; padding: 5px;"> <div style="float: left"> <h1>My Site</h1> </div> <div style="float: right; padding: 10px; text-align: right;"> <!-- User store in session with attribute: loginedUser --> Hello <b>${loginedUser.userName}</b> <br/> Search <input name="search"> </div> </div>
/WEB-INF/views/_menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <div style="padding: 5px;"> <a href="${pageContext.request.contextPath}/">Home</a> | <a href="${pageContext.request.contextPath}/productList">Product List</a> | <a href="${pageContext.request.contextPath}/userInfo">My Account Info</a> | <a href="${pageContext.request.contextPath}/login">Login</a> </div>
/WEB-INF/views/_footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <div style="background: #E0E0E0; text-align: center; padding: 5px; margin-top: 10px;"> @Copyright o7planning.org </div>
Quand vous saisissez le chemin par défaut, par exemple taper le nom du domaine de site, il va afficher la page d'accueil (Le cas contextPath = ""), vous devez déclarer votre page d'accueil dans <welcome-file-list> de web.xml
Le lien en dessous va afficher le contenu de la page index.html
Vous devez créer une page d'accueil qui est une JSP ayant des informations dynamiques au lieu de la page html qui contient des informations statiques.
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>SimpleWebApp</display-name> <filter-mapping> <filter-name>jdbcFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>cookieFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>home</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
Des modèles de la page d'accueil:

HomeServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = { "/home"}) public class HomeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public HomeServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Forward to /WEB-INF/views/homeView.jsp // (Users can not access directly into JSP pages placed in WEB-INF) RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/homeView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
/WEB-INF/views/homeView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Home Page</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Home Page</h3> This is demo Simple web application using jsp,servlet & Jdbc. <br><br> <b>It includes the following functions:</b> <ul> <li>Login</li> <li>Storing user information in cookies</li> <li>Product List</li> <li>Create Product</li> <li>Edit Product</li> <li>Delete Product</li> </ul> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>
Réexécutez votre application et essayez 2 URLs:

REMARQUE: Pour une raison quelle qu'elle soit, le lien http://localhost:8080/SimpleWebApp/ est encore affiché le contenu de index.html, vous pouvez supprimer ou changer le nom du fichier index.html, par exemple, vous pouvez le changer en _index.html
C'est le modèle de fonction de Login:

LoginServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; 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.simplewebapp.beans.UserAccount; import org.o7planning.simplewebapp.utils.DBUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebServlet(urlPatterns = { "/login" }) public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LoginServlet() { super(); } // Affichez la page de connexion. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Transmettez vers la page /WEB-INF/views/loginView.jsp // (L'utilisateur ne peut pas accéder directement // à la page JSP qui se trouve dans le dossier WEB-INF). RequestDispatcher dispatcher // = this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp"); dispatcher.forward(request, response); } // Lorsque l'utilisateur saisit userName & password, et presse le bouton Submit. // Cette méthode sera exécutée. @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("userName"); String password = request.getParameter("password"); String rememberMeStr = request.getParameter("rememberMe"); boolean remember = "Y".equals(rememberMeStr); UserAccount user = null; boolean hasError = false; String errorString = null; if (userName == null || password == null || userName.length() == 0 || password.length() == 0) { hasError = true; errorString = "Required username and password!"; } else { Connection conn = MyUtils.getStoredConnection(request); try { // Cherchez user dans DB. user = DBUtils.findUser(conn, userName, password); if (user == null) { hasError = true; errorString = "User Name or password invalid"; } } catch (SQLException e) { e.printStackTrace(); hasError = true; errorString = e.getMessage(); } } // Au cas où il y a des erreurs, // forward (transmettre) vers /WEB-INF/views/login.jsp if (hasError) { user = new UserAccount(); user.setUserName(userName); user.setPassword(password); // Enregistrez des données dans l'attribut de la demande avant de les transmettre. request.setAttribute("errorString", errorString); request.setAttribute("user", user); // Forward (Transmettre) vers la page /WEB-INF/views/login.jsp RequestDispatcher dispatcher // = this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp"); dispatcher.forward(request, response); } // S'il n'y a pas de l'erreur. // Enregistrez les informations de l'utilisateur dans Session. // Et transmettez vers la page userInfo. else { HttpSession session = request.getSession(); MyUtils.storeLoginedUser(session, user); // Si l'utilisateur sélectionne la fonction "Remember me". if (remember) { MyUtils.storeUserCookie(response, user); } // Si non, supprimez Cookie else { MyUtils.deleteUserCookie(response); } // Redirect (Réorienter) vers la page /userInfo. response.sendRedirect(request.getContextPath() + "/userInfo"); } } }
UserInfoServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; 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.simplewebapp.beans.UserAccount; import org.o7planning.simplewebapp.utils.MyUtils; @WebServlet(urlPatterns = { "/userInfo" }) public class UserInfoServlet extends HttpServlet { private static final long serialVersionUID = 1L; public UserInfoServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); // Vérifiez si l'utilisateur s'est connecté (login) ou pas. UserAccount loginedUser = MyUtils.getLoginedUser(session); // Pas connecté (login). if (loginedUser == null) { // Redirect (Réorenter) vers la page de connexion. response.sendRedirect(request.getContextPath() + "/login"); return; } // Enregistrez des informations à l'attribut de la demande avant de forward (transmettre). request.setAttribute("user", loginedUser); // Si l'utilisateur s'est connecté, forward (transmettre) vers la page // /WEB-INF/views/userInfoView.jsp RequestDispatcher dispatcher // = this.getServletContext().getRequestDispatcher("/WEB-INF/views/userInfoView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

/WEB-INF/views/loginView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Login Page</h3> <p style="color: red;">${errorString}</p> <form method="POST" action="${pageContext.request.contextPath}/login"> <table border="0"> <tr> <td>User Name</td> <td><input type="text" name="userName" value= "${user.userName}" /> </td> </tr> <tr> <td>Password</td> <td><input type="text" name="password" value= "${user.password}" /> </td> </tr> <tr> <td>Remember me</td> <td><input type="checkbox" name="rememberMe" value= "Y" /> </td> </tr> <tr> <td colspan ="2"> <input type="submit" value= "Submit" /> <a href="${pageContext.request.contextPath}/">Cancel</a> </td> </tr> </table> </form> <p style="color:blue;">User Name: tom, password: tom001 or jerry/jerry001</p> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>
/WEB-INF/views/userInfoView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>User Info</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Hello: ${user.userName}</h3> User Name: <b>${user.userName}</b> <br /> Gender: ${user.gender } <br /> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>
Réexécutez votre applicaton:


Modèle:

ProductListServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.simplewebapp.beans.Product; import org.o7planning.simplewebapp.utils.DBUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebServlet(urlPatterns = { "/productList" }) public class ProductListServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ProductListServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = MyUtils.getStoredConnection(request); String errorString = null; List<Product> list = null; try { list = DBUtils.queryProduct(conn); } catch (SQLException e) { e.printStackTrace(); errorString = e.getMessage(); } // Stockez des informations dans l'attribut de la demande avant de transmettre aux views. request.setAttribute("errorString", errorString); request.setAttribute("productList", list); // Transmettez vers la page /WEB-INF/views/productListView.jsp RequestDispatcher dispatcher = request.getServletContext() .getRequestDispatcher("/WEB-INF/views/productListView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
/WEB-INF/views/productListView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Product List</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Product List</h3> <p style="color: red;">${errorString}</p> <table border="1" cellpadding="5" cellspacing="1" > <tr> <th>Code</th> <th>Name</th> <th>Price</th> <th>Edit</th> <th>Delete</th> </tr> <c:forEach items="${productList}" var="product" > <tr> <td>${product.code}</td> <td>${product.name}</td> <td>${product.price}</td> <td> <a href="editProduct?code=${product.code}">Edit</a> </td> <td> <a href="deleteProduct?code=${product.code}">Delete</a> </td> </tr> </c:forEach> </table> <a href="createProduct" >Create Product</a> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>
Réexécutez l'application:

Modèle:

CreateProductServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.simplewebapp.beans.Product; import org.o7planning.simplewebapp.utils.DBUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebServlet(urlPatterns = { "/createProduct" }) public class CreateProductServlet extends HttpServlet { private static final long serialVersionUID = 1L; public CreateProductServlet() { super(); } // Affichez la page de création du produit. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = request.getServletContext() .getRequestDispatcher("/WEB-INF/views/createProductView.jsp"); dispatcher.forward(request, response); } // Lorsque l'utilisateur saisit des informations sur le produit, cliquez sur Submit. // Cette méthode sera appelée. @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = MyUtils.getStoredConnection(request); String code = (String) request.getParameter("code"); String name = (String) request.getParameter("name"); String priceStr = (String) request.getParameter("price"); float price = 0; try { price = Float.parseFloat(priceStr); } catch (Exception e) { } Product product = new Product(code, name, price); String errorString = null; // ID du produit est la chaîne littérale [a-zA-Z_0-9] // Avec au moins une lettre. String regex = "\\w+"; if (code == null || !code.matches(regex)) { errorString = "Product Code invalid!"; } if (errorString == null) { try { DBUtils.insertProduct(conn, product); } catch (SQLException e) { e.printStackTrace(); errorString = e.getMessage(); } } // Enregistrez des informations dans l'attribut de la demande, avant de passer aux vues. request.setAttribute("errorString", errorString); request.setAttribute("product", product); // S'il y a des erreurs, forward (transmettez) vers la page 'edit'. if (errorString != null) { RequestDispatcher dispatcher = request.getServletContext() .getRequestDispatcher("/WEB-INF/views/createProductView.jsp"); dispatcher.forward(request, response); } // S'il n'y a aucun problème. // Redirect (Réorientez) vers la page de la liste des produits. else { response.sendRedirect(request.getContextPath() + "/productList"); } } }
/WEB-INF/views/createProductView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Create Product</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Create Product</h3> <p style="color: red;">${errorString}</p> <form method="POST" action="${pageContext.request.contextPath}/createProduct"> <table border="0"> <tr> <td>Code</td> <td><input type="text" name="code" value="${product.code}" /></td> </tr> <tr> <td>Name</td> <td><input type="text" name="name" value="${product.name}" /></td> </tr> <tr> <td>Price</td> <td><input type="text" name="price" value="${product.price}" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="Submit" /> <a href="productList">Cancel</a> </td> </tr> </table> </form> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>

Modèle:

EditProductServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.simplewebapp.beans.Product; import org.o7planning.simplewebapp.utils.DBUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebServlet(urlPatterns = { "/editProduct" }) public class EditProductServlet extends HttpServlet { private static final long serialVersionUID = 1L; public EditProductServlet() { super(); } // Affichez la page d'édition du produit. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = MyUtils.getStoredConnection(request); String code = (String) request.getParameter("code"); Product product = null; String errorString = null; try { product = DBUtils.findProduct(conn, code); } catch (SQLException e) { e.printStackTrace(); errorString = e.getMessage(); } // Aucune erreur. // Le produit n'existe pas à éditer. // Réorientez vers la page la liste des produits. if (errorString != null && product == null) { response.sendRedirect(request.getServletPath() + "/productList"); return; } // Enregistrez des informations à l'attribut de la demande avant de transmettre aux vues. request.setAttribute("errorString", errorString); request.setAttribute("product", product); RequestDispatcher dispatcher = request.getServletContext() .getRequestDispatcher("/WEB-INF/views/editProductView.jsp"); dispatcher.forward(request, response); } // Une fois que l'utilisateur modifie les informations sur le produit, cliquez sur Submit. // Cette méthode sera exécutée. @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = MyUtils.getStoredConnection(request); String code = (String) request.getParameter("code"); String name = (String) request.getParameter("name"); String priceStr = (String) request.getParameter("price"); float price = 0; try { price = Float.parseFloat(priceStr); } catch (Exception e) { } Product product = new Product(code, name, price); String errorString = null; try { DBUtils.updateProduct(conn, product); } catch (SQLException e) { e.printStackTrace(); errorString = e.getMessage(); } // Enregistrez des informations à l'attribut de la demande avant de transmettre aux vues. request.setAttribute("errorString", errorString); request.setAttribute("product", product); // S'il n'y a pas d'erreur, transmettez à la page d'édition. if (errorString != null) { RequestDispatcher dispatcher = request.getServletContext() .getRequestDispatcher("/WEB-INF/views/editProductView.jsp"); dispatcher.forward(request, response); } // S'il n'y a aucun problème. // Réorientez vers la page de la liste des produits. else { response.sendRedirect(request.getContextPath() + "/productList"); } } }
/WEB-INF/views/editProductView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Edit Product</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Edit Product</h3> <p style="color: red;">${errorString}</p> <c:if test="${not empty product}"> <form method="POST" action="${pageContext.request.contextPath}/editProduct"> <input type="hidden" name="code" value="${product.code}" /> <table border="0"> <tr> <td>Code</td> <td style="color:red;">${product.code}</td> </tr> <tr> <td>Name</td> <td><input type="text" name="name" value="${product.name}" /></td> </tr> <tr> <td>Price</td> <td><input type="text" name="price" value="${product.price}" /></td> </tr> <tr> <td colspan = "2"> <input type="submit" value="Submit" /> <a href="${pageContext.request.contextPath}/productList">Cancel</a> </td> </tr> </table> </form> </c:if> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>
Modèle:

DeleteProductServlet.java
package org.o7planning.simplewebapp.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.simplewebapp.utils.DBUtils; import org.o7planning.simplewebapp.utils.MyUtils; @WebServlet(urlPatterns = { "/deleteProduct" }) public class DeleteProductServlet extends HttpServlet { private static final long serialVersionUID = 1L; public DeleteProductServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = MyUtils.getStoredConnection(request); String code = (String) request.getParameter("code"); String errorString = null; try { DBUtils.deleteProduct(conn, code); } catch (SQLException e) { e.printStackTrace(); errorString = e.getMessage(); } // S'il y a une erreur, forward (transmettez) vers la page d'erreur\. if (errorString != null) { // Enregistrez des informations dans l'attribut de la demande avant de transmettre aux vues. request.setAttribute("errorString", errorString); // RequestDispatcher dispatcher = request.getServletContext() .getRequestDispatcher("/WEB-INF/views/deleteProductErrorView.jsp"); dispatcher.forward(request, response); } // S'il n'y a aucun problème. // Redirect (réorientez) vers la page de la liste des produits. else { response.sendRedirect(request.getContextPath() + "/productList"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
/WEB-INF/views/deleteProductErrorView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Delete Product</title> </head> <body> <jsp:include page="_header.jsp"></jsp:include> <jsp:include page="_menu.jsp"></jsp:include> <h3>Delete Product</h3> <p style="color: red;">${errorString}</p> <a href="productList">Product List</a> <jsp:include page="_footer.jsp"></jsp:include> </body> </html>