Configuration complète d'une application JFinal

Initialisation du projet web dynamique

Commencez par créer un nouveau projet web dynamique dans votre IDE, puis importez les bibliothèques requises pour le framework JFinal.

Définition du fichier web.xml

Configurez le descripteur de déploiement pour intégrer le filtre JFinal. Voici un exemple adapté :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1">
    <display-name>MonApplicationJFinal</display-name>
    <filter>
        <filter-name>jfinalFilter</filter-name>
        <filter-class>com.jfinal.core.JFinalFilter</filter-class>
        <init-param>
            <param-name>configClass</param-name>
            <param-value>com.monapp.configuration.AppConfig</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jfinalFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>accueil.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Fichier de configuration des propriétés

Créez un fichier properties pour les paramètres de base de données et l'applicasion :

base.url = jdbc:mysql://localhost:3306/monprojet?useUnicode=true&characterEncoding=UTF-8
utilisateur = root
motdepasse = 
mode.dev = true

Classe de configuration JFinal

Définissez la configuration principale qui charge les propriétés et initialise les composants :

package com.monapp.configuration;

import com.jfinal.config.*;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.view.ViewType;

public class AppConfig extends JFinalConfig {

    @Override
    public void configConstant(Constants constantes) {
        loadPropertyFile("application.properties");
        constantes.setDevMode(getPropertyToBoolean("mode.dev", false));
        constantes.setViewType(ViewType.JSP);
        constantes.setBaseViewPath("/WEB-INF/pages");
    }

    @Override
    public void configRoute(Routes routes) {
        routes.add("/articles", ArticleController.class);
        routes.add("/accueil", HomeController.class);
    }

    @Override
    public void configPlugin(Plugins plugins) {
        C3p0Plugin c3p0 = new C3p0Plugin(getProperty("base.url"), getProperty("utilisateur"), getProperty("motdepasse"));
        plugins.add(c3p0);
        ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0);
        plugins.add(arp);
        arp.addMapping("articles", Article.class);
    }

    @Override
    public void configInterceptor(Interceptors intercepteurs) {
    }

    @Override
    public void configHandler(Handlers gestionnaires) {
    }

    public static void main(String[] args) {
        JFinal.start("src/main/webapp", 8080, "/", 5);
    }
}

Contrôleur pour les articles

Implémentez un contrôleur pour gérer les opérations CRUD sur les articles :

package com.monapp.controllers;

import java.util.Date;
import com.jfinal.core.Controller;

public class ArticleController extends Controller {

    public void liste() {
        setAttr("listeArticles", Article.dao.find("SELECT * FROM articles"));
        render("liste.jsp");
    }

    public void creer() {
        String soumis = getPara("soumis");
        if (soumis == null || soumis.isEmpty()) {
            render("formulaire.jsp");
        } else {
            Article nouvelArticle = getModel(Article.class, "article");
            nouvelArticle.set("dateCreation", new Date());
            nouvelArticle.save();
            liste();
        }
    }

    public void supprimer() {
        Integer identifiant = getParaToInt(0);
        if (identifiant == null || identifiant <= 0) {
            renderText("Identifiant invalide");
            return;
        }
        boolean suppression = Article.dao.deleteById(identifiant);
        if (!suppression) {
            renderText("Article introuvable");
            return;
        }
        liste();
    }

    public void modifier() {
        String soumis = getPara("soumis");
        if (soumis == null || soumis.isEmpty()) {
            Integer id = getParaToInt(0);
            if (id == null || id <= 0) {
                renderText("Erreur de données");
                return;
            }
            setAttr("articleExistant", Article.dao.findById(id));
            render("edition.jsp");
        } else {
            Article articleModifie = getModel(Article.class, "article");
            articleModifie.update();
            liste();
        }
    }
}

Modèle de données

Créez une clase modèle pour interagir avec la table des articles :

package com.monapp.models;

import com.jfinal.plugin.activerecord.Model;

public class Article extends Model<Article> {
    public static final Article dao = new Article();
}

Vue JSP pour l'affichage

Concevez une page JSP pour lister les articles avec une interface Bootstrap :

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <meta charset="UTF-8">
    <title>Liste des articles</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-4">
        <h1>Articles publiés</h1>
        <a href="/articles/creer" class="btn btn-success mb-3">Nouvel article</a>
        <table class="table table-bordered table-hover">
            <thead class="thead-dark">
                <tr>
                    <th>ID</th>
                    <th>Titre</th>
                    <th>Contenu</th>
                    <th>Date</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <c:forEach items="${listeArticles}" var="art">
                    <tr>
                        <td>${art.id}</td>
                        <td>${art.titre}</td>
                        <td>${art.contenu}</td>
                        <td>${art.dateCreation}</td>
                        <td>
                            <a href="/articles/supprimer/${art.id}" class="btn btn-danger btn-sm">Supprimer</a>
                            <a href="/articles/modifier/${art.id}" class="btn btn-warning btn-sm">Modifier</a>
                        </td>
                    </tr>
                </c:forEach>
            </tbody>
        </table>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

Étiquettes: JFinal Java MySQL JSP Bootstrap

Publié le 30 juillet à 10h08