Master e-services 2015
Une servlet est un objet java qui étends l'interface "Servlet" ou "HTTPServlet".
Cette interface définie 2 méthodes qui sont appelées lorsque le code est chargé/arrêté par le serveur web qui "expose" ces servlets à travers une URL.
Ces méthodes "init" et "destroy" permettent d'initialiser un certain nombre d'élément au lancement de la servlet ou de nettoyer le contexte lors de leur arrêt.
Le serveur web va interpréter une partie de la requête HTTP envoyée par le navigateur de l'internaute et appelée une méthode de la servlet qui est responsable du traitement de cette requête.
C'est la méthode "service" qui est appelée.
Cette méthode possède une implémentation par défaut dans la classe abstraite "HTTPServlet". Elle appelle la méthode doGet, doPost, doHead, doOptions, doPut, doTrace en fonction du type de requête HTTP lancée au serveur.
Les deux paramètres de ces opérations sont "HTTPServletRequest" et "HTTPServletResponse".
Ils permettent respectivement d'analyser la requête réalisée par l'internaute, et de lui répondre.
Utiliser Firebug
Firebug est un plugin très pratique pour firefox et vous devriez l'installer. Il permet de visualiser la structure HTML d'une page, de debugger du javascript, d'analyser les échanges réseaux, les cookies et bien d'autres choses ...
Nous allons réaliser une première servlet très simple en essayant de "tout faire à la main".
Depuis l'écriture dans un éditeur de texte basique, la compilation et le lancement dans un serveur web de type "tomcat 8" allégé.
import java.io.IOException;
import java.io.Writer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bonjour")
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("nom");
if ( name == null || name.isEmpty() ) name = "tout le monde";
Writer out = resp.getWriter();
out.write("<p>Bonjour <b>" + name + "</b> !</p>");
}
}
Pour compiler ce code il faudra avoir le répertoire $JAVA_HOME/bin dans votre PATH (voir installation des outils). Il faut en effet pouvoir exécuter le compilateur "javac" facilement.
Il sera également nécessaire de mettre la librairie "servlet-api.jar" dans votre CLASSPATH. Cette librairie contient toutes les interfaces et classes abstraites que nous implémentons en faisant des servlets.
Elle est fournie (entre autre) avec tomcat, dans le répertoire "lib".
javac -cp (chemin vers tomcat)/lib/servlet-api.jar MyServlet.java
Cela a du créer un fichier "MyServlet.class" qui est notre servlet, branchée sur l'url "/bonjour" du contexte "/tp1".
Lançons notre serveur web.
rendez-vous dans le répertoire tomcat8/bin et exécutez ./catalina.sh run
Après quelques secondes votre serveur est lancé et accessible sur "http://localhost:8080"
Utilisez votre navigateur, puis la commande curl pour interroger votre servlet
curl -v http://localhost:8080/tp1/bonjour
A. Essayez de passer votre nom en paramètre d'abord en GET.
B. Modifier votre servlet pour n'accepter que le paramètre en POST. Tester à l'aide d'un formulaire écrit dans un fichier html sauvegardé n'importe où ... puis avec curl
C. Modifiez votre servlet pour afficher le formulaire sur le GET et pour afficher "bonjour xxx" lors d'un POST.
Créez une nouvelle servlet accessible à l'url /tp1/dist, qui calculera la distance à vol d'oiseau entre deux points du globe.
Les points seront donnés en coordonnées géographique (latitude, longitude) selon le format : DD.ddddddd (degrés et dixième de degrés).
Les paramètres seront les suivants :
lat1, lng1 : latitude et longitude du premier point.
lat2, lng2 : latitude et longitude du deuxieme point.
Les paramètres doivent pouvoir être passés en GET ou en POST.
La réponse html contiendra la distance au format 123,45km.
Si un paramètre est manquant le serveur renverra une erreur 400.
La formule pour obtenir la distance entre 2 point GPS est la suivante :
acos( sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lng1-lng2) ) * R;R vaut 6366 selon la norme WGS84. Attention, en JAVA, les angles doivent être données en radians pour les fonction acos, sin, cos ...
java -jar check.jar check-dist
Jsp est un équivalent java des fichiers asp ou php. C'est une manière de mettre du java, exécuté coté serveur, dans une page html. Le jsp n'est pas interprété, il est en fait traduit en java puis compilé (généralement au premier appel de la page), et ensuite exécuté. C'est le résultat de cette exécution qui donne le code html renvoyé au navigateur.
Nous utiliserons "jasper" comme implémentation du moteur de jsp, il est fourni avec tomcat.
Afin de distinguer le code html ou javascript à donner au navigateur et le code java à éxécuter sur le serveur, nous utilisons les balises "<%" et "%>" pour délimiter le code java.
Une balise particulière permet de définir des propriétés sur le type de réponse HTTP, l'encodage de la page, ou encore les imports java nécessaire pour la compilation de la page. Toutes ces directives se retrouvent entre les balises "<%@" et "%>".
Enfin, il est très courant de vouloir afficher le contenu d'une variable dans le html qui sera renvoyé au navigateur. Cela peut se faire en faisant un <% out.print( maVariable ); %>
mais un tag a été défini pour réduire l'écriture à <%= maVariable %>
qui fait exactement la même chose.
Comme nous sommes de bon développeurs consciencieux, nous n'hésiterons également pas à utiliser le tag permettant de mettre des commentaires dans nos jsp : <%-- mon super commentaire qui ne sera pas compilé ou envoyé au navigateur --%>
Il faut bien comprendre que la jsp va être traduite en code java. Plus précisément en une classe qui hérite de Servlet dont il sera exécuter la méthode "service". Dans certains cas il peut être utile de vouloir introduire des attributs ou des méthodes à cette classe générée et compilée.
Cela peut se faire avec le tag <%! private double montant; %>
Depuis votre code java, vous pouvez utiliser les variables suivantes :
Pour rendre l'écriture de nos jsp un peu plus modulaire il est possible d'inclure du code jsp à partir d'une autre page jsp. Cela se fera via la directive <%@ include file="ma_page.jsp" %> Si vous donnez un chemin absolu au fichier (exemple /layout/header.jsp), la racine considéré est celle du contexte web du serveur. Il est ainsi plus facile d'être indépendant de l'environnement de déploiement.
Il est également possible de traiter le début d'une requête avec une servlet et de déléguer l'affichage à une page jsp. Dans la servlet nous utiliserons alors req.getRequestDispatcher("/ma/page.jsp").forward(req, resp)
Pour passer des objets de la servlet à la jsp, il sera possible d'utiliser l'objet request et ses méthodes setAttribute / getAttribute.
Reprenez le contenu de ce fichier et mettez le dans un fichier "test.jsp", dans votre répertoire tomcat/webapps/tp1.
Accédez à la page http://localhost:8080/tp1/test.jsp
Le premier accès est un peu plus long car "jasper", le moteur jsp, transforme votre source jsp en source java, puis le compile et enfin il exécute ce code.
Pour les appels suivant, le code est simplement exécuté comme n'importe quel autre servlet.
Vous pouvez d'ailleurs regarder le contenu du source java généré dans le répertoire de travail de tomcat : tomcat/work/Catalina/localhost/tp1/org/apache/jsp
Regarder le source peut aider à comprendre une erreur glissée dans la jsp, ou à analyser une exception relevée par le code exécuté.
Ecrire une page présentant un film, permettant aux visiteurs de laisser un commentaire.
Les commentaires seront simplement laissés dans une "List" stockée en static dans la servlet.
Chaque démarrage (ou re-démarrage) de tomcat entrainera donc la perte des données.
Git est un logiciel libre de gestion de versions. Il permet de stocker un ensemble de fichiers en conservant la chronologie de toutes les modifications qui ont été effectuées dessus. Il permet notamment de retrouver les différentes versions d'un lot de fichiers connexes.
Git a la particularité d'être décentralisé : les sources peuvent être stockées sur différents serveurs, chacun des serveurs pouvant évoluer à leur rythme.
Git a été créé par Linus Torvalds, le papa de Linux.
git init
*.class
*~
git add .
git status
git commit -m "Mon premier commit"
git remote add origin https://xxUSERxx@bitbucket.org/xxUSERxx/xxPROJETxx.git
git push -u origin --all
Depuis l'université vous devez utilisé le protocole HTTPS en passant par le proxy.
Cela nécessite de saisir votre mot de passe bitbucket lorsque vous ferez un git pull
ou un git push
.
De chez vous (ou ailleurs) vous pourriez utiliser le protocol ssh pour communiquer avec bitbucket.
Consultez la documentation en cas de soucis.
Git utilise normalement le protocol ssh pour échanger des fichiers entre le serveur et votre ordinateur.
Pour utiliser ce protocol avec git vous devez tout d'abords générer une clé ssh si vous n'en avez pas déjà une.
ssh-keygen
Laissez les paramètres par défaut et ne mettez pas de passphrase à votre clé.
Dans bitbutcket il faut associer la clé généré à votre compte. Cela ce passe dans votre profil (en haut à droite) sous "manage account"
Ouvrez le sous-menu "SSH Keys" et ajoutez une clé
Copier/Coller le contenu du fichier ~/.ssh/id_rsa.pub
(ou id_dsa.pub selon le système)
Votre système et votre compte bitbucket sont maintenant configurés pour utiliser ssh.
vous devriez être en mesure d'utiliser les URL de type "git@bitbucket.org:xxUSERxx/xxPROJETxx.git" sans utiliser de mot de passe.
git n'est pas disponible nativement sous windows. Souvenez-vous qu'il a été créé par Linus Torvalds ;-)
Il existe plusieurs alternatives pour utiliser git sous windows, dont :
tortoiseGit et msysgit
Après avoir installé ces outils vous devriez retrouver les fonctionnalités de clone, add, commit, push et autre ...
tortoise offre tout cela de manière plus graphique alors que msysgit utilise une console (un bash dans un cygwin minimaliste).