- 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
- Thêm sản phẩm
- La page de modifier du produit
- Effacer le produit
Créer une application Web Java simple à l'aide de Servlet, JSP et JDBC
1. Introduction
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 à:
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:
2. Le principe lors de la programmation Servlet + JSP
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.
4. Préparer la base de données
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);
5. Créer le Projet de WebApp
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>
6. La configuration de l'environnement d'exécution (Runtime Environment)
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.
7. Exécuter l'application pour la première fois
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.
8. Télécharger et déclarer la bibliothèque JDBC
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:
Les résultats sont téléchargés:
Copiez ces bibliothèque dans WEB-INF/lib:
9. Télécharger et déclarer la bibliothèque JSTL
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:
10. Des classes javabeans sont simulées dans la base de données
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;
}
}
11. Des classes utilitaires de connexion à la base de données
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) {
}
}
}
12. La classe utilitaire et la manipulation des données
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();
}
}
13. Créer Servlet Filter pour connecter à la base de données
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);
}
}
}
14. Le Servlet Filter lit des Cookies pour se connecter automatiquement
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>
15. EncodingFilter Servlet
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);
}
}
16. Des pages réutilisées
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>
17. La page d'accueil
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
18. La page de connexion - LoginServlet
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:
19. La page de la liste des produits
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:
20. Thêm sản phẩm
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>
21. La page de modifier du produit
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>
22. Effacer le produit
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>
Tutoriels de programmation Java Servlet/JSP
- Installer Tomcat Server pour Eclipse
- Installer Glassfish Web Server sur Windows
- Exécutez l'application Web Java Maven dans Tomcat Maven Plugin
- Exécutez l'application Web Java Maven dans Jetty Maven Plugin
- Exécuter une tâche d'arrière-plan dans l'application Java Servlet
- Le Tutoriel de Java Servlet pour des débutants
- Le Tutoriel de Java Servlet Filter
- Le Tutoriel de Java JSP
- Le Tutoriel de Java JSP Standard Tag Library (JSTL)
- Installer Web Tools Platform pour Eclipse
- Créez une application de connexion simple et sécurisez les pages avec Java Servlet Filter
- Créer une application Web Java simple à l'aide de Servlet, JSP et JDBC
- Upload et Download de fichiers stockés sur le disque dur avec Java Servlet
- Télécharger et télécharger des fichiers à partir de la base de données à l'aide de Java Servlet
- Affichage une image dans une base de données avec Java Servlet
- Redirection 301, redirection permanente dans Java Servlet
- Comment redirige http en https automatiquement dans une application web de Java?
- Utiliser Google reCAPTCHA dans l'application Web Java
Show More