Pour démarrer, faire les exercices 1 et 2 de https://arche.univ-lorraine.fr/mod/resource/view.php?id=2398731

Projet Netbeans

La mise en place du projet est résumée en vidéo : https://video.hainry.fr/w/abN3KtCrcaX1G92kemyBg6

Créer un nouveau projet Java with Ant/Java Web > Web Application

Dans le projet Netbeans, créer un nouveau Servlet en cochant la case ☑ Add information to deployment descriptor (web.xml)

Ajouter la bibliothèque Postgresql-jdbc : Clic droit sur Libraries puis Add Library…. Sélectionner PostgreSQL JDBC Driver.

Depuis Tomcat 9, il faut utiliser les “JNDI DataSources” pour accéder à la base de données au lieu du DriverManager utilisé précédemment. Suivons les instructions de https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html#PostgreSQL à savoir :

Dans context.xml, ajouter sous le nœud <Context> une Resource (avec les bonnes informations dans les attributs url, username et password). Il pourra être nécessaire de transformer le nœud <Context>pour qu’il ne soit plus autofermant.

<Context path="/WebApplication"> 
    <Resource name="jdbc/postgres" auth="Container"
        type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
        url="jdbc:postgresql://postgresql-std-blabla.apps.kappsul.su.univ-lorraine.fr:5432/vglobe"
        username="postgres" password="P4SSW0RD" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
</Context>

L’url, le username et le password sont à renseigner correctement ainsi que vu dans la partie JDBC.

Dans web.xml, dans le nœud <web-apps>, ajouter un resource-ref.

<web-apps>
 ...
<resource-ref>
    <description>postgreSQL Datasource</description>
    <res-ref-name>jdbc/postgres</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
</web-apps>

Dans chaque servlet, pour lire le contexte, on utilisera les bibliothèques suivantes :

import javax.naming.InitialContext;
import javax.sql.DataSource;

Puis pour se connecter à la base de données,

InitialContext cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
Connection maConnexion = ds.getConnection();

(en pensant à rattraper les exceptions)

On prépare, exécute et traite ensuite la requête comme vu précédemment mais au lieu d’afficher le json obtenu, nous allons le renvoyer via le serveur http :

String res = gson.toJson(cl);

response.setContentType("application/json;charset=UTF-8");
/* ce Content-Type permettra par exemple à firefox de représenter le json joliment */
try (PrintWriter out = response.getWriter()) {
    out.println(res);
}

Note : nous avons ici encore utilisé un “try with resources”, syntaxe qui permet de s’assurer que les ressources déclarées dans les parenthèses du try seront correctement fermées une fois utilisées1. Cela remplace ici PrintWriter out = response.getWriter(); out.println(res); out.close(); qui ne garantit pas complètement que le out.close(); sera exécuté.

CORS

Ce serveur d’API est maintenant fonctionnel mais ne sera pas utilisable dans un client web à cause de la protection contre les XSS (cross-site scripting). Pour rendre que le serveur permette de faire les requêtes depuis une page web, il faut configurer le CORS (Cross-Origin Resource Sharing) dans le fichier web.xml :

<web-app>
...
    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
        <init-param>
            <param-name>cors.allowed.origins</param-name>
            <param-value>*</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Livrables

Produire trois servlets correspondant aux requêtes donnant

  • le classement d’une édition (/Course)
  • le palmarès d’un skipper (/Skipper)
  • le palmarès d’un bateau (/Bateau)

Déposer les fichiers suivants :

  1. une archive .zip du projet (obtenue en faisant Export projectdans le menu File),
  2. le fichier .war obtenu en utilisant le bouton Marteau/balai (clean and build) de netbeans et qui doit se trouver dans un sous dossier dist dans l’arborescence du projet.

Suite

Développement d’un client web


  1. dans le cas du cnx.close() dans la partie JDBC, si un problème se pose entre la création et la fermeture (ou que le close est oublié), cette fermeture peut ne pas se faire et causer des multiplications de connexions inutiles s’accumulant dans la mémoire et occupant le SGBD.↩︎