Vous avez reçu un message "Your GitLab account has been locked ..." ? Pas d'inquiétude : lisez cet article https://docs.gricad-pages.univ-grenoble-alpes.fr/help/unlock/

README.md 6.3 KB
Newer Older
1
2
3
4
5
6
7
8
9
# AppliCafesWeb

Application Web à base de servlets/JSP montrant de manière progressive la mise en place 
d'une architecture MVC (Model/View/Controller). 

Il s'agit de lister les consommations de cafés d'une équipe de développeurs pour une 
semaine donnée. Les consommations sont stockées dans une base de données relationnelle
(base SQLite - version de SQLite et de pilote JDBC utilisée 3.34). 

10
11
12
La démarche qui a guidé l'écriture de cette application et l'évolution des différentes versions de 
celle-ci est détaillée dans le cours [Application WEb : vers une architecture MVC](http://lig-membres.imag.fr/genoud/teaching/PL2AI/cours/pdf/PL2/PL2_19MVC.pdf)

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Les différentes versions (Releases) de l'application correspondent aux différentes évolutions de celle-ci
et sont définies par un tag sur la branche master du projet.

Pour récupérer les sources de ce projet vous pouvez

* soit utiliser git en effectuant la commande 
   ```
   git clone git@gricad-gitlab.univ-grenoble-alpes.fr:enseignement1/m2cci/java/AppliWebCafe.git
   ```
  
  Votre espace de travail contient alors le code de la dernière version (release) du projet (branche master). 
  Pour accéder au code d'une release antérieure, effectuez une commande extrayant ce code dans  
  dans une branche (cela évite de *polluer* votre espace de travail avec le contenu de la branche master).

  Pour créer un branche correspondant au commit tagué par l'étiquette vx.x
  ```
  git branch version.x.x vx.x
  ```

  Pour vous placer dans cette branche
  ```
  git checkout version.x.x
  ```

  Pour revenir sur la branche master

  ```
  git checkout master
  ```

  pour détruire une branche 

  ```
  git branch -d nomDeLaBranche
  ```

* soit récupérer une archive (.tar.gz ou .zip) de l'une des releases du projet

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
## dernière release v3.0

Dans cette release la base de données a été modifiée, de façon à ce que les données de consommation ne soient plus relevées par semaine, mais de manière quotidienne. Les tables ont donc été recrées de la manière suivante :

```sql
CREATE TABLE PROGRAMMEURS (
    ID_PROGRAMMEUR INTEGER NOT NULL,
    NOM VARCHAR(32) NOT NULL, 
    PRENOM VARCHAR(32) NOT NULL,
    BUREAU INTEGER, 
    PRIMARY KEY (ID_PROGRAMMEUR)
);

CREATE TABLE CONSOS_CAFE (
   JOUR VARCHAR(10) NOT NULL,
   ID_PROGRAMMEUR INTEGER NOT NULL, 
   NB_TASSES INTEGER,
   PRIMARY KEY (JOUR, ID_PROGRAMMEUR),
   FOREIGN KEY(ID_PROGRAMMEUR) REFERENCES PROGRAMMEURS(ID_PROGRAMMEUR)
);
```

l'insertion de données peut se faire à l'aide des requêtes SQL suivantes

```sql
-- création d'un programmeur
INSERT INTO PROGRAMMEURS VALUES (1, "NOM1", "Prenom1", 101);
INSERT INTO PROGRAMMEURS VALUES(2, "NOM2", "Prenom2", 202);
INSERT INTO PROGRAMMEURS VALUES(3, "NOM3", "Prenom3", 303);

-- création d'une consommation (pour en faire plus voir le programme 
-- CreateConsosCafes dans les test du projet CafesDAO)
INSERT INTO CONSOS_CAFE (JOUR, ID_PROGRAMMEUR, NB_TASSES) 
	VALUES ('2021-01-03', 1, 2);
```

Philippe Genoud's avatar
Philippe Genoud committed
87
SQLite ne supportant pas les dates de manière native, le type **VARCHAR(10)** est utilisé pour la colonne **JOUR** plutôt que le type **DATE**. Cependant pour pouoir manipuler ces dates facilement (tant en SQL que en Java), la date correspondant à un jour est définie selon le format standard ISO **'YYYY-MM-DD'  (année, jour, mois). Cela permet en SQL de faire facilement des comparaisons sur les dates et en Java la conversion vers des objets **java.time.LocalDate** et inversement la conversion de tels objets vers des chaînes de caractères pouvant être stockées en base de données.
88
89
90
91

En plus de cette modification majeure, le code des différents projets (CafesModel, CafeDAO et CAfesWeb) a largement été refactorisé et amélioré en vue d'extensions futures.
 
## Releases précédentes disponibles
92
93
94
95
96

### v0.1 :

Version initiale de l'application web de consultation des consommations de café. 
Application *naïve* où la connection est définie dans la methode **init** de la servlet
Philippe Genoud's avatar
Philippe Genoud committed
97
98
99
100
101
102
103
et qui contient tout le code JDBC.

### v1.0

Utilisation d'un objet `DataSource` géré par le conteneur (Tomcat) pour les connexions JDBC.

Pour en savoir plus sur les `DataSources` voir les slides du cours : 
Philippe Genoud's avatar
Philippe Genoud committed
104
105
106
107
108
109
110
111
[Utilisation de Tomcat et de JDBC : DataSources](http://lig-membres.imag.fr/genoud/teaching/PL2AI/cours/pdf/PL2/PL2_18DataSourceTomcat.pdf).

### v1.1

Choix entre deux types d'affichage HTML ou PDF. Pour la génération du pdf on utilise
*  [Apache PDFBox] (https://pdfbox.apache.org/)
*  [Boxable] (https://github.com/dhorions/boxable) pour générer des tableaux en PDF

Philippe Genoud's avatar
Philippe Genoud committed
112
113
114
115
116
117
La servlet **ConsosSemServlet** prend en charge les deux types d'affichages.

### v1.2

Définition d'un servlet contrôleur qui en fonction du format demandé redirige la 
requête vers
Philippe Genoud's avatar
Philippe Genoud committed
118
* soit une servlet prenant en charge l'affichage sous forme de table HTML
Philippe Genoud's avatar
Philippe Genoud committed
119
120
121
122
123
124
125
126
127
128
129
* soit une servlet prenant en charge l'affichage sous la forme d'un fichier PDF

### v1.3 :

Mise en place d'une architecture MVC (Model/View/Controller) pour une meilleure séparation des responsabilités :

* un modèle pour représenter un programmeur et sa consommation de café hebdomadaire
* un DAO pour construire la liste des programmeurs et  de leur consommation à partir de la BD (JDBC)
* deux vues: 
   * une servlet pour l'affichage PDF 
   * une servlet pour l'affichage HTML
130
* le contrôleur crée le modèle et le transmet ensuite aux vues en le passant comme attribut de la requête HTTP.
Philippe Genoud's avatar
Philippe Genoud committed
131
132
133
134

### v1.4 :

Remplacement de la servlet ConsosSemHTMLServlet par une page JSP (Java Server Pages)
135
136
137
138
139
140
141
142
143
144
145
146
Définition d'une vue HTML plus déclarative en remplaçant la servlet se chargeant 
de la génération de la page HTML par une page JSP (Java Server Page).
On met un peu de JAVA dans du HTML plutôt que d'avoir du HTML dans le code Java.

Pour en savoir plus sur les JSP voir les slides du cours 19 : [Introduction aux JSP](http://lig-membres.imag.fr/genoud/teaching/PL2AI/cours/pdf/PL2/PL2_19JSP.pdf).


### v1.5 :

Refactoring de l'application, les package `dao` et `model` sont 
retirés de l'application Web et mis dans des applications java indépendantes. 
Cela facilite la modularité et la réutilisation du code par d'eventuels autres projets.
147
148
149
150
151
152
153
 
### v2.0 :

Refactoring de l'application. 
- utilisation de Bootstrap 4 pour l'interface
- utilisation d'AJAX (via JQuery) pour charger le code HTML de la table des
  résultats lorsque la numéro de semaine est changé