La compréhension de l'histoire des technologies Java Web et de leur évolution est essentielle pour approfondir la maîtrise de cet écosystème.
L'émergence des Servlets
Dans les années 1990, avec l'expansion d'Internet et des navigateurs, l'architecture B/S basée sur le navigateur s'est imposée. Initialement, les requêtes des utilisateurs visaient des ressources statiques comme les fichiers HTML et CSS. Cependant, le traitement dynamique des requêtes selon les besoins de l'utilisateur est rapidement devenu une nécessité.
Pour répondre à cette exigence, Java a introduit la technologie Servlet.
Avec les Servlets, l'intégralité du contenu de la page doit être généré via des instructions de sortie. Le'xemple de code suivant produit une page affichant "Hello World!".
protected void traiterRequete(HttpServletRequest requete, HttpServletResponse reponse)
throws IOException, ServletException {
reponse.setContentType("text/html;charset=UTF-8");
PrintWriter ecriture = reponse.getWriter();
ecriture.println("<html>");
ecriture.println("<head><title>Exemple</title></head>");
ecriture.println("<body>");
ecriture.println("<p>Contenu généré dynamiquement</p>");
ecriture.println("</body></html>");
}
L'apparition des JSP
Après l'introduction des Servlets, il est apparu que leur programmation était laborieuse. D'une part, le code contenait de nombreuses répétitions, notamment pour les instructions de sortie. D'autre part, les développeurs de Servlets devaient maîtriser le développement frontend et l'intégration de code HTML, ce qui rendait la création de pages complexes et visuellement attrayantes difficile.
En s'inspirant de la technologie ASP de Microsoft, Sun Microsystems a donc lancé les JSP (JavaServer Pages). Cette approche permet de générer l'interface directement en HTML, avec l'insertion de code Java à l'aide de balises spécifiques comme <% %>.
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head><title>Démonstration JSP</title></head>
<body>
<p>Valeur calculée : <% String valeur = "Exemple"; out.println(valeur); %></p>
</body>
</html>
L'adoption du modèle MVC avec la version Servlet 1.2
Les JSP ont introduit leurs propres défis : les développeurs frontend devaient naviguer dans du code métier complexe, tandis que les développeurs backend peinaient à identifier les sections de Servlet dans un code frontend enchevêtré.
C'est ainsi que le triptyque JSP+JavaBean+Servlet, incarnent le modèle MVC, est né.
- JSP (Vue) : Gère l'affichage et la saisie, en s'appuyant principalement sur des balises HTML et JSP.
- Servlet (Contrôleur) : Assure le pilotage de l'application, reçoit les requêtes, invoque les traitements métier (JavaBean) et sélectionne la page JSP appropriée pour la réponse.
- JavaBean (Modèle) : Encapsule l'ensemble des traitements et de la logique applicative.
L'ère des frameworks
Malgré les apports du modèle MVC, des problèmes persistaient : la présence de code Java dans les JSP désorganisait le code, et pour les projets d'envergure, la multiplication des Servlets, des redirections et des configurations rendait la maintenance complexe. Ces lacunes ont conduit à l'émergence de frameworks dédiés.
L'arrivée de Struts
En juin 2001, la version 1.0 de Struts a été publiée. Ce framework a introduit une bibliothèque de balises spécifiques pour les JSP, éliminant ainsi le code Java de ces pages et améliorant leur structure. Il a remplacé les Servlets par des classes Action, qui héritaient des fonctionnalités de contrôleur tout en ajoutant des capacités comme le filtrage des requêtes et le transcodage automatique.
L'émergence de Spring
Un nouveau problème est apparu : dans les classes Action, la création manuelle d'objets pour les DAO et les JavaBeans augmentait le couplage entre les composants, s'opposant au principe de "haute cohésion, faible couplage".
Le framework Spring a apporté deux concepts fondamentaux pour résoudre cette problématique : l'Inversion de Contrôle (IoC) et la Programmation Orientée Aspect (AOP). L'IoC externalise la création, l'attribution et la gestion des objets, réduisant ainsi le couplage dans le code. L'AOP permet d'injecter des fonctionnalités transversales comme la journalisation et la gestion des erreurs à différents points de l'exécution du programme.
La naissance de Spring MVC
L'intégration de Struts et Spring imposait de déclarer chaque bean dans le contexte Spring et de configurer chaque URL dans le fichier de configuration de Struts. Pour les applications de grande taille avec de nombreux beans et routes, ces fichiers de configuration devenaient excessivement volumineux et complexes à maintenir.
Spring MVC est arrivé comme une solution alternative. En s'appuyant sur des annotations, il a remplacé la configuration XML de Struts. Le contrôleur Spring (@Controller) a supplanté la classe Action de Struts, intégrent les métadonnées de configuration directement dans le code via des annotations. Cette approche a significativement réduit la complexité des fichiers de configuration.