Application Web JSP/Jetty avec Maven

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 14 mai 2022 à 18:37


Application web

Une application web est un programme se servant du navigateur web comme interface, mais dont tout le traitement des données est géré côté serveur. En particulier les pages web sont générées dynamiquement afin de les personnaliser à partir d'informations (fournies par l'utilisateur par exemple).

Nous nous intéresserons ici à créer un projet simple avec des JSP (JavaServer Pages) pour générer les pages web sur un serveur Jetty, dont l'installation et l'utilisation sera totalement gérée par Maven.

Note : pour tester les code de cet article il est nécessaire de connaître un minimum Maven, celui-ci doit aussi être correctement installé sur votre machine. Vous pouvez consulter l'article Débuter avec Maven.

Projet JSP

Dans un premier temps, il faut créer la structure du projet avec l'archetype maven-archetype-webapp
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4 -DgroupId=org.ccm.maven -DartifactId=firstwebapp -DinteractiveMode=false


Celui-ci est initialement composé de ces fichiers :
├───firstwebapp
│ │ pom.xml
│ │
│ └───src
│ └───main
│ └───webapp
│ │ index.jsp
│ │
│ └───WEB-INF
│ web.xml

Intéressons nous tout d'abord à la page index.jsp, dont le contenu est ceci :
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

Il s'agit pour l'instant d'une simple page HTML, nous verrons un peu plus tard comment rajouter des instructions Java à l'intérieur afin d'en dynamiser le contenu.

Maintenant regardons le fichier pom.xml, son contenu est initialement celui-ci :
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.ccm.maven</groupId>
  <artifactId>firstwebapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>firstwebapp Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>firstwebapp</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Serveur Jetty

Pour "mettre en ligne" notre application web, il nous faut un serveur d'application Java. Pour cela nous allons ajouter un plugin Jetty qui pourra démarrer le serveur depuis une commande Maven.
Pour cela il faut modifier le fichier pom.xml pour ajouter ceci après le finalName de la ligne 32.
    <plugins>
      <plugin>
        <groupId>org.eclipse.jetty </groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>11.0.9</version>
      </plugin>
    </plugins>

Note : les versions sont amenées à évoluer au cours du temps, vous pouvez consulter le dépôt central Maven pour vous informer des dernières versions des dépendances et plugins.

Installation et démarrage

Dans un premier temps il faut installer l'application, c'est à dire prendre toutes les sources des projets et les assembler dans une archive web WAR. La commande à exécuter est :
mvn clean install

Vous avez maintenant un dossier target dans votre dossier projet, celui-ci contient le fichier WAR qui permet de déployer l'application sur n'importe quel serveur d'application Java. Par exemple Jetty. Il suffit alors de démarrer le serveur en exécutant la commande :
mvn jetty:run

Vous pouvez maintenant consulter l'application web à l'adresse http://localhost:8080

Par défaut vous êtes immédiatement redirigé vers la page index.jsp qui vous affiche "HelloWorld!"

Dynamisation de la JSP avec Java

La partie Maven est terminée, vous avez la base d'un projet web qui fonctionne, il n'y a plus qu'à le compléter à votre guise. Mais afin de vous montrer un peu ce qu'il est possible de faire en JSP nous allons modifier la page index.jsp pour la dynamiser un peu.


Par exemple, on veut qu'en utilisant l'adresse http://localhost:8080/?name=Toto la page affiche "Bonjour Toto" et ce quelque soit le nom qui est passé en argument.
De plus, on affichera le nombre de visiteurs de la page au fur et à mesure qu'on y accède.

<%-- Gestion des accents (entre autre) --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>

<%-- Date de démarrage de la JSP --%>
<%@ page import="java.util.Date"%>
<%! Date startDate = new Date(); %>

<%-- Nombre de visiteurs sur la page. --%>
<%! int nbVisitors = 0; %>

<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <%-- On affiche le nom s'il est passé en paramètre --%>
    <h2>Bonjour <%= request.getParameter("name") != null ? request.getParameter("name") : "" %> !</h2>

    <%-- On incrémente le nombre de visiteurs et on l'affiche. --%>
    <p>Vous êtes le <%= ++nbVisitors %>è visiteur de cette page depuis son démarrage le <%= String.format("%1$te %1$tB à %1$tkh%1$tM",startDate) %>.</p>
  </body>
</html>

Il n'est pas nécessaire de redémarrer le serveur pour prendre en compte les modifications d'une JSP, ces changements se font automatiquement. Il suffit donc de retourner sur le site et de tester l'URL avec ou sans l'argument "name" :

Remarque : il est possible de créer des classes Java complètes, puis d'utiliser leurs méthodes au sein de la page JSP, pour faire des applications web très puissantes, notamment grâce à l'utilisation de base de données et de nombreux framework et plugins qui enrichissent la technologie.
NB. En pratique on évitera l'utilisation des scriptlets
<%= %>
qui sont vulnérables à l'injection de code.