Nous utilisons Tomcat comme serveur HTTP, Netbeans comme IDE, PostgreSQL comme SGBD. Ici quelques points sur l’installation de netbeans et tomcat sous debian et sous macOS. Nous verrons aussi la configuration du projet netbeans pour accéder à la base de données. Enfin, un Dockerfile pour lancer la base de données dans un conteneur.

Sous Debian GNU/Linux

Installation de netbeans

sudo apt install openjdk-17-jdk libpostgresql-jdbc-java

Téléchargement de apache-netbeans_17-1_all.deb sur https://netbeans.apache.org/download/nb17/

sudo dpkg -i apache-netbeans_17-1_all.deb

Installation de Tomcat

Notre serveur HTTP de développement sera dans le chemin ~/Tomcat

sudo apt install tomcat9-user tomcat9-admin
tomcat9-instance-create ~/Tomcat
cp -r /usr/share/tomcat9-admin/manager ~/Tomcat/webapps

Dans netbeans, dans l’onglet Services, ligne Servers,

  • Add Server...
  • Choisir Apache Tomcat or TomEE
  • Server Location : /usr/share/tomcat9 , ☑ Use Private Base : ~/Tomcat.
  • Mettre un User Name et un Password et cocher ☑ Create user if it does not exist

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

Sous macOS

Installation de netbeans

Télécharger un fichier pkg depuis le site officiel de Netbeans. Puis l’exécuter et lancer netbeans.

Installation de tomcat

Télécharger un fichier zip depuis le site officiel de Tomcat. Décompresser ce fichier (par exemple dans ~). Rendre les scripts exécutables (chmod a+x bin/*.sh dans le dossier décompressé).

Dans netbeans, dans l’onglet Services, ligne Servers,

  • Add Server...
  • Choisir Apache Tomcat or TomEE
  • Server Location : Browse et sélectionner le dossier apache-tomcat-9.0.90.
  • Mettre un User Name et un Password (par exemple tomcat9 tomcat9) et cocher ☑ Create user if it does not exist

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

Projet Netbeans

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. 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://127.0.0.1:5432/vglobe"
        username="admin" password="m2104" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
</Context>

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

<web-apps>
 ...
<resource-ref>
    <description>postgreSQL Datasource example</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 les servlets, 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)

Pour le CORS

Ainsi qu’indiqué dans https://tomcat.apache.org/tomcat-9.0-doc/config/filter.html#CORS_Filter, dans web.xml, sous le nœud <web-apps>, ajouter un filter et un filter-mapping.

<web-apps>
 ...
<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-apps>

Conteneurs

PostgreSQL

Dans un dossier pg, je place le script de création de la base de données vg.sql et le Dockerfile suivant :

FROM docker.io/library/postgres
ENV POSTGRES_PASSWORD blop
COPY vg.sql /docker-entrypoint-initdb.d/
CMD ["postgres", "-c", "log_statement=all", "-c", "logging_collector=on"]

Puis build et run :

sudo docker build -t pgimoca pg
sudo docker run -dt -p 5432:5432 pgimoca

Utilisateur : postgres, mot de passe : blop