Présentation du projet
Ce projet est une application web complète pour la gestion d'une boutique de jeux vidéo. L'architecture est divisée en une partie front-end pour les clients et un tableau de bord d'administration. Deux profils d'utilisateurs sont gérés : un administrateur avec un accès complet à la gestion des produits, des commandes et des clients, et un utilisateur standard pouvant parcourir le catalogue, gérer son panier et passer des commandes.
Environnement technique
- Langage et framework serveur : Java avec des Servlets et JSP.
- Base de données : MySQL 5.7 ou supérieur.
- Serveur d'application : Apache Tomcat 8 ou supérieur.
- Bibliothèques front-end : Bootstrap pour la mise en page réactive, jQuery et JavaScript natif pour l'interactivité.
- Environnement de développement : IDE comme IntelliJ IDEA, Eclipse ou MyEclipse. Un JDK 8 ou plus est requis.
Fonctionnalités principales
Côté Administration : Authentification sécurisée, tableau de bord avec des listes paginées pour gérer les utilisateurs, les jeux (CRUD), les catégories et le suivi des commandes avec filtrage par statut.
Côté Client : Parcours du catalogue par catégorie, moteur de recherche, système de panier d'achat, processus de commande et historique des commandes personnel.
Mise en route
Pour déployer l'application :
- Créez une base de données dans MySQL et importez le schéma fourni.
- Importez le projet dans votre IDE. Configurez le fichier de source de données (
DBUtil.java) avec vos paramètres de connexion MySQL. - Déployez l'archive WAR sur votre serveur Tomcat. L'URL d'accès est généralemant
http://localhost:8080/chemin_appli.
Identifiants de test :
- Client :
user/123456 - Administrateur :
admin/admin
Extraits de code illustratifs
Voici des exemples refactorisés montrant l'implémentation de certaines fonctionnalités.
Gestion de l'inscription utilisateur
@WebServlet(name = "AccountRegistration", urlPatterns = "/signup")
public class AccountRegistrationServlet extends HttpServlet {
private AccountManager accountMgr = new AccountManager();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User newUser = new User();
try {
BeanUtils.populate(newUser, req.getParameterMap());
} catch (Exception e) {
throw new ServletException("Erreur de mapping des paramètres", e);
}
if (accountMgr.createAccount(newUser)) {
req.setAttribute("notification", "Inscription réussie. Veuillez vous connecter.");
req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp);
} else {
req.setAttribute("error", "Ce nom d'utilisateur ou email existe déjà.");
req.getRequestDispatcher("/WEB-INF/views/register.jsp").forward(req, resp);
}
}
}
Liste paginée des clients pour l'administrateur
@WebServlet("/admin/customers")
public class AdminCustomerListServlet extends HttpServlet {
private AccountManager accountMgr = new AccountManager();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int requestedPage = parsePageNumber(req.getParameter("p"));
PaginatedResult<User> userPage = accountMgr.fetchUsers(requestedPage);
handlePageBoundary(userPage, requestedPage);
req.setAttribute("paginationData", userPage);
req.getRequestDispatcher("/WEB-INF/admin/customer_list.jsp").forward(req, resp);
}
private int parsePageNumber(String param) {
try {
return Math.max(1, Integer.parseInt(param));
} catch (NumberFormatException | NullPointerException e) {
return 1;
}
}
private void handlePageBoundary(PaginatedResult<?> page, int current) {
if (page.totalPages == 0) {
page.totalPages = 1;
} else if (current > page.totalPages) {
page.currentPage = page.totalPages; // Corrige la page demandée
}
}
}
Ajout d'un produit avec gestion d'image
@WebServlet("/admin/product/save")
public class AdminProductSaveServlet extends HttpServlet {
private ProductService productSvc = new ProductService();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
DiskFileItemFactory diskFactory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(diskFactory);
try {
List<FileItem> formItems = fileUpload.parseRequest(req);
Product product = buildProductFromForm(formItems);
processProductImages(formItems, product);
productSvc.addProduct(product);
resp.sendRedirect(req.getContextPath() + "/admin/products");
} catch (Exception e) {
throw new ServletException("Échec de la sauvegarde du produit", e);
}
}
private Product buildProductFromForm(List<FileItem> items) throws UnsupportedEncodingException {
Product product = new Product();
for (FileItem item : items) {
if (item.isFormField()) {
populateField(product, item.getFieldName(), item.getString("UTF-8"));
}
}
return product;
}
private void processProductImages(List<FileItem> items, Product product) throws Exception {
// Logique simplifiée pour traiter les fichiers uploadés et les associer au produit
// ...
}
}
Écouteur d'application pour précharger les catégories
@WebListener
public class CatalogueLoader implements ServletContextListener {
private CategoryService categoryService = new CategoryService();
@Override
public void contextInitialized(ServletContextEvent sce) {
List<Category> allCategories = categoryService.getAllCategories();
sce.getServletContext().setAttribute("globalCategories", allCategories);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// Ressources à libérer si nécessaire
}
}