Menu

2014-04-02  Edit

crim.fr, prof java

Java Web, introduction aux servlets et JSP

  • HTTP
  • protocole texte client / serveur
    • Méthodes : GET, HEAD, POST, (OPTIONS, CONNECT, TRACE, PUT, DELETE)
    • Type MIME
  • URL
  • HTML

Site/application web

  • Ensemble cohérent d'URLs retournant des documents HTML
  • Site web statique
    • sert du contenu statique
  • Application Web
    • génère du contenu dynamiquement à partir d'une base de données, d'informations fournies par l'utilisateur...
    • La génération des pages peut s'effectuer en PHP, Java, Python...

TP : Application Web en Java

  • Créer un nouveau projet Eclipse nommé webcrim avec les dossiers suivants :
    • web/
    • web/WEB-INF
    • web/WEB-INF/lib
    • web/WEB-INF/classes
    • web/WEB-INF/src
  • Dans la configuration du build-path du projet, changer le dossier de sortie de compilation de build/ en web/WEB-INF/classes

Moteur de servlet

  • Nécessaire pour déployer une application Web Java
  • Nombreuses solutions disponibles, en OpenSource : Apache Tomcat et Jetty

Tomcat

  • Tomcat est un logiciel libre de la fondation Apache. C'est un moteur de servlet, un serveur d'applications Web écrites en Java
  • Télécharger Tomcat 7.0.52
    • Sous Windows, choisir la version zip sans installeur (1er lien)
    • Sous Linux et Mac OS X, choisir la version tar.gz (2ème lien)
  • Décompresser l'archive dans un dossier en dehors du projet que nous désignerons ensuite par $TOMCAT_HOME
  • Ouvrir une fenêtre en ligne de commande
  • Se placer dans le dossier $TOMCAT_HOME et démarrer le serveur Tomcat (sous Linux ou Mac OS X) :
    bin/startup.sh

ou (sous Windows) :

    bin\startup
  • Ouvrir un navigateur à l'adresse http://localhost:8080 (ou http://127.0.0.1:8080) pour vérifier que Tomcat fonctionne correctement
  • Cliquer sur le bouton "Manager app", un login/mot de passe est demandé.
  • Voir ci-dessous pour ajouter un compte :
Utilisateurs

Éditer le fichier $TOMCAT_HOME/conf/tomcat-users.xml et ajouter les deux lignes suivantes avant la dernière balise fermante :

    <role rolename="manager-gui" />
    <user username="admin" password="admin" roles="manager-gui" />

pour définir un utilisateur admin/admin qui pourra gérer les applications Web

Arrêter Tomcat (en ligne de commande) :

    bin/shutdown.sh

ou

    bin\shutdown
  • Redémarrer Tomcat
  • Ouvrez la partie "manager"

1ère application Web

Dans web/ ajouter le fichier index.html contenant

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>WebCRIM</title>
    </head>
    <body>
        <h1>Bienvenue !</h1>
    </body>
    </html>

Dans le dossier web/WEB-INF ajouter le fichier web.xml qui décrit votre application :

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        version="2.5">
        <display-name>WebCRIM</display-name>
        <description>Ma première application Web en Java !</description>
    </web-app>
  • Ouvrir une fenêtre de commande dans le dossier web/
  • Créer le fichier webcrim.war qui contiendra votre application :
    jar -cvf webcrim.war *
  • Vous avez réalisé votre première application Web Java !
  • Copier le fichier webcrim.war dans $TOMCAT_HOME/webapps
  • Ouvrir un navigateur à l'adresse http://localhost:8080/webcrim pour tester votre application
  • Le format war est un moyen très pratique de livrer une application web Java.

Déploiement avec fichiers de contexte

  • En période de développement, il peut-être pratique de ne pas avoir à reconstruire un war pour tester chaque modification
  • Dans ce cas, on ne place rien dans le dossier webapps et on utilise un fichier de contexte qui référence l'emplacement de la webapp

Dans le dossier $TOMCAT_HOME/conf/Catalina/localhost, créer un fichier webcrim.xml avec le contenu suivant :

    <?xml version="1.0" encoding="UTF-8"?>
    <Context docBase="[chemincompletdevotreprojet]/web"
        privileged="true" allowLinking="true" crossContext="true" reloadable="true"   
        path="/webcrim">
    </Context>

Attention sous Windows, on remplacera les contre-obliques par les obliques, ex :

    docBase="C:/coursjava/20140402/webcrim/web"

plutôt que :

    docBase="C:\coursjava\20140402\webcrim\web"

1ère servlet

Pour permettre la compilation de la classe de servlet, ajouter le fichier $TOMCAT_HOME/lib/servlet-api.jar au build path du projet Eclipse.

Créer une classe fr.crim.a2013.web.Bonjour dans le dossier web/WEB-INF/src avec le contenu suivant :

    package fr.crim.a2013.web;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class Bonjour extends HttpServlet {

        /** Serial version uid. */
    private static final long serialVersionUID = -3761256026297694930L;

        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws IOException, ServletException {

            response.setContentType("text/html");
            PrintWriter writer = response.getWriter();
            writer.println("<!DOCTYPE html>");
            writer.println("<html>");
            writer.println("<head>");
            writer.println("\t<meta charset=UTF-8>");
            writer.println("\t<title>Bonjour à tous !</title>");
            writer.println("</head>");
            writer.println("<body>");
            writer.println("<h1>Bonjour !</h1>");
            writer.println("</body>");
            writer.println("</html>");
        }
    }

Compléter le fichier web/WEB-INF/web.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        version="2.5">

        <display-name>CRIM - web</display-name>
        <description>Tests de servlets et JSP</description>

        <servlet>
            <servlet-name>Bonjour</servlet-name>
            <servlet-class>fr.crim.a2013.web.Bonjour</servlet-class>
        </servlet>

        <servlet-mapping>
            <servlet-name>Bonjour</servlet-name>
            <url-pattern>/bonjour</url-pattern>
        </servlet-mapping>
    </web-app>

Tester votre servlet à l'adresse http://localhost:8080/webcrim/bonjour

Quelques ajustements

Si le titre affiché dans la fenêtre du navigateur comporte un problème d'accent,
dans votre servlet, changer la ligne :

    response.setContentType("text/html");

en :

    response.setContentType("text/html; charset=UTF-8");

pour forcer l'encodage de la réponse

  • Recharger la page dans le navigateur
Une servlet qui renvoie un contenu dynamique

Objectif : présenter une page avec un formulaire de saisie du prénom et à la
soumission du formulaire, saluer l'internaute par son prénom.

Pour cela, on va créer une nouvelle servlet fr.crim.a2013.web.BonjourPersonnalise avec le contenu suivant :

    package fr.crim.a2013.web;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class BonjourPersonnalise extends HttpServlet {

        /**
         * Bonjour [prenom]
         */
        private static final long serialVersionUID = 8262291579315542220L;

        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws IOException, ServletException {

            // On récupère le prénom passé en paramètre URL
            String prenom = request.getParameter("prenom");

            // Et on écrit le contenu de la page
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter writer = response.getWriter();
            writer.println("<!DOCTYPE html>");
            writer.println("<html>");
            writer.println("<head>");
            writer.println("\t<meta charset=\"UTF-8\">");
            writer.println("\t<title>Bonjour personnalisé</title>");
            writer.println("</head>");
            writer.println("<body>");

            // Bonjour personnalisé
            if (prenom != null) {
                writer.println("<h1>Bonjour "+prenom+" !</h1>");
            }

            // Le formulaire de saisie
            writer.println("<br/>Indiquez votre prénom et cliquez sur le bouton Saluer !");
            writer.println("<form method=\"get\">");
            writer.println("<label>Prénom :</label>");
            writer.println("<input type=\"text\" name=\"prenom\" />");
            writer.println("<input type=\"submit\" value=\"Saluer !\" />");
            writer.println("</form>");

            writer.println("</body>");
            writer.println("</html>");
        }
    }
  • On modifiera le fichier web.xml pour que l'url http://localhost:8080/webcrim/bonjour ne pointe plus vers la servlet Bonjour mais BonjourPersonnalise
  • Tester la nouvelle page
  • Problème d'encodage lorsque vous indiquez un prénom comportant des caractères accentués ?
    Modifier le fichier $TOMCAT_HOME/conf/server.xml à la ligne 72 pour ajouter l'attribut
    URIEncoding="UTF-8" à la balise <Connector>. Redémarrer Tomcat pour prendre en compte la modification.

JSP

Une JSP qui renvoie du contenu dynamique

Dans le projet Eclipse, on crée un nouveau fichier nommé bonjour_personnalise.jsp dans le dossier web avec le contenu suivant :

    <%@page language="java" contentType="text/html" pageEncoding="UTF-8"%>
    <%
        // Récupération du paramètre URL
        String prenom = request.getParameter("prenom");
    %>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Bonjour à vous</title>
    </head>
    <body>
        <% if (prenom != null) { %>
        <h1>Bonjour <%= prenom %> !</h1>
        <% } %>

        <br/>Indiquez votre prénom et cliquez sur le bouton Saluer !
        <form method="get">
            <label>Prénom :</label>
            <input type="text" name="prenom" />
            <input type="submit" value="Saluer !" />
        </form>
    </body>
    </html>
  • Ouvrir votre navigateur à la page http://localhost:8080/webcrim/bonjour_personnalise.jsp
  • Notes :
    • À l'utilisation d'une JSP, une servlet correspondante est automatiquement générée dans le dossier $TOMCAT_HOME/work/Catalina/localhost/webcrim/org/apache/jsp et compilée
    • Une modification effectuée sur une JSP est automatiquement prise en compte (sans rechargement de l'application

Une URL peut être associée à une JSP via une règle dans le fichier web/WEB-INF/web.xml :

    <servlet>
        <servlet-name>BonjourEnJSP</servlet-name>
        <jsp-file>/bonjour_personnalise.jsp</jsp-file>
    </servlet>

    <servlet-mapping>
        <servlet-name>BonjourEnJSP</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

Avec la configuration ci-dessus, notre JSP est aussi accessible à l'adresse http://localhost:8080/webcrim/hello

Exercice

Le 3ème et dernier exercice noté dans le cadre du contrôle continu du
2nd semestre consistera en une transposition web de votre programme
"Concordancier des misérables".

Vous fournirez une application Web Java sous forme de fichier .war
autonome (contenant les sources Java) qui pourra être testé en le
déposant simplement dans le dossiers webapps d'un moteur de servlet type
Apache Tomcat.
Le fichier .war devra contenir toutes les bibliothèques nécessaires au fonctionnement de votre application (même le fichier jar de sqlite).

Il vous est demandé de transposer votre projet "Concordancier" dans l'état où vous l'avez rendu à F. Glorieux.

Pour faciliter le déploiement de vos rendus sur une même instance de
Tomcat (par exemple dev.fictif.org), il vous est demandé de respecter le nommage suivant pour vos
wars : concordancier-{prenom}{initialedunom}.war

Ex : concordancier-pierred.war et accès à l'adresse
http://localhost:8080/concordancier-pierred/
ou http://dev.fictif.org:8080/concordancier-pierred/

Note : la page d'accueil de votre webapp devra présenter le moteur de recherche ou un lien vers le moteur de recherche.

Le rendu est attendu pour le 25/04 à minuit

Accès au chemin sur le disque

Pour obtenir un chemin sur le disque à partir d'un chemin relatif dans la webapp

    String path = getServletConfig().getServletContext().getRealPath("index.html");

Related

Wiki: Home

Discussion

Anonymous
Anonymous

Add attachments
Cancel





Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.