--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+>
+<html xmlns="http://www.w3.org/1999/xhtml" >
+ <head>
+ <title>JSP</title>
+
+ <meta http-equiv="Content-Type"
+ content="text/html; charset=utf-8" />
+ <meta name="copyright"
+ content="Copyright © 2013 Kim Nguyễn" />
+
+ <!-- Load jQuery -->
+ <script src="../jquery-1.9.1.min.js" type="text/javascript" ></script>
+ <!-- Load the library -->
+ <script src="../simpleWebSlides.js" type="text/javascript" ></script>
+
+ <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css" media="all" />
+ <!-- Load a custom Theme, the class-element marks this style-sheet
+ a "theme" that can be swtiched dynamicaly -->
+ <link class="sws-theme" rel="stylesheet" title="U-Psud style" href="../themes/uPsud.css" type="text/css" />
+
+ <!-- Customize some templates and initialize -->
+ <style type="text/css">
+ .xml-tag { color: #00486c; }
+ </style>
+ <script type="text/javascript">
+ <![CDATA[
+ SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
+ SWS.Config['sws-object-deactivate'] = SWS.Effects.objectDeactivateFadeOut;
+ SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
+
+ //Ensures that we load SWS at the very end, after MathJax has
+ //been initialized
+
+ $(window).load(function () {
+ $(".inline-xml").each(function(i, elem)
+ {
+ var jelem = $(elem);
+ var code = jelem.html();
+ code = code.replace ("<![CDATA" + "[", "").replace ("]" + "]>", "");
+ code = code.replace (/>/g, ">>>");
+ code = code.replace (/</g, "<span class='xml-tag'><");
+ code = code.replace (/>>>/g,"></span>");
+
+ jelem.html(code);
+ });
+ });
+
+ var checkSVG = function (o, i)
+ {
+ if (i >= 10 || SWS.Utils.isUndefined(o) || o == null) return;
+ var svg = o.getSVGDocument();
+ if (svg == null) {
+ setTimeout(function() { checkSVG(o, i+1); }, 200);
+ } else {
+ var alltext = $(svg).find("text");
+ alltext.css("font-family", "DIN");
+ alltext.css("font-size", "70%");
+
+ };
+ };
+ $(window).load(function() {
+ $("embed").ready(function() {
+ setTimeout(function() {
+ $("embed").each(function(i, o) { checkSVG(this,0); });
+}, 1000);
+ });
+ });
+ $(window).load(SWS.Presentation.init);
+
+ ]]>
+
+ </script>
+
+ </head>
+ <body>
+ <a href="xpi_07.xhtml" class="sws-previous"/>
+ <div class="sws-slide sws-cover sws-option-nofooter">
+ <h1>XML et Programmation Internet</h1>
+ <h1>Cours 8</h1>
+ <a href="mailto:kn@lri.fr">kn@lri.fr</a>
+ </div>
+ <h1>Principe</h1>
+ <div class="sws-slide">
+ <h1>Programmation Web coté serveur</h1>
+ <p>(rappel) génération de pages-web dynamiques (<i>i.e.</i> dont
+ le contenu est calculé en fonction de la requête
+ HTTP). Plusieurs choix de langage côté serveur.
+ </p>
+ <ul>
+ <li>PHP (déploiement de site très simple,
+ langage <span style="text-decoration:line-through">merdique</span>
+ particulier)
+ </li>
+ <li>Python, Ruby (manque de standardisation, plusieurs
+ framework concurrents, problèmes de performances)</li>
+ <li>ASP .NET (microsoft) </li>
+ <li><a>Java/JSP</a> (langage raisonnable, déploiement complexe)</li>
+ </ul>
+
+ </div>
+ <div class="sws-slide">
+ <h1>JSP</h1>
+ <p>JSP (Java Server Pages) est un <i>framework</i> permettant de
+ créer des pages Web dynamiques en Java. Il fait partie de la
+ suite Java EE (Entreprise Edition). Rappel :
+ </p>
+ <ul>
+ <li>Java Card (Java pour cartes de crédit, très peu de choses,
+ pas de GC)</li>
+ <li>Java ME (Micro Edition, pour les périphériques embarqués,
+ mobiles, etc.)</li>
+ <li>Java SE (Standard Edition, java « normal »)</li>
+ <li>Java EE (Entreprise Edition, SE + packages pour JSP, et autres)</li>
+ </ul>
+ </div>
+ <div class="sws-slide">
+ <h1>Architecture</h1>
+ <p>Nécessite un serveur Web particulier. Le standard est Apache Tomcat.</p>
+ <ul>
+ <li>Le programmeur écrit des fichiers <tt>.jsp</tt>, contenant
+ du HTML + du java dans des balises spéciales</li>
+ <li>(Le programmeur déploie les fichiers sur le serveur
+ Tomcat)</li>
+ <li>L'utilisateur navigue vers une page <tt>foo.jsp</tt></li>
+ <li>Le serveur Tomcat génère <tt>fooServlet.class</tt></li>
+ <li>La classe est chargée dans la JVM java et (sa métode
+ principale) est exécutée, produisant une page HTML</li>
+ <li>La page HTML est envoyée au navigateur</li>
+ </ul>
+ </div>
+ <div class="sws-slide">
+ <h1>Exemple</h1>
+ <code class="background:white;">
+ <![CDATA[<%@ page contentType="text/html; charset=UTF-8" %>
+
+ <!DOCTYPE html>
+ <html>
+ <head><title>test JSP</title>
+ <meta charset="UTF-8"/>
+ </head>
+ <body>
+ Page created on
+ <%]]>
+ java.util.Date d = new java.util.Date();
+ <s>out</s>.println(d.toString());
+ <![CDATA[%>
+ </body>
+ </html>]]></code>
+ </div>
+<div class="sws-slide">
+<h1>balises spéciales JSP</h1>
+<p>JSP introduit 4 balises spéciales qui sont interprétée par le
+ serveur Tomcat.
+</p>
+<ul>
+ <li>Balise de configuration : <tt><%@ … %></tt> (options HTML,
+ import de packages, …)</li>
+ <li>Balise de déclarations : <tt><%! … %></tt> (déclarer des
+ attributs et des méthodes)</li>
+ <li>Balises d'instructions : <tt><% … %></tt> (permet de mettre
+ une suite d'instructions)</li>
+ <li>Balises d'expressions : <tt><%= … %></tt> (permet de mettre
+ une expression dont le résultat est converti en <tt>String</tt>)</li>
+</ul>
+</div>
+ <div class="sws-slide">
+ <h1>Exemple complet</h1>
+ <code style="background:white;"> <![CDATA[<%@ page contentType="text/html; charset=UTF-8" %>
+ <%@ page import="java.util.Date" %>
+ <!DOCTYPE html>
+ <html>
+ <head><title>test JSP</title>
+ <meta charset="UTF-8"/>
+ </head>
+ <%!
+ Date maDate;
+
+ Date maMethode() {
+ return new Date();
+ }
+ %>
+ <body>
+ <%
+ maDate = maMethode();
+ %>
+ Page created on <%= maDate %>
+ </body>
+ </html>]]></code>
+ </div>
+<div class="sws-slide">
+ <h1>Objets par défaut</h1>
+<p>Le code placé dans les balises spéciales a accès à certains objets
+ automatiquement déclarés. Parmi les principaux :
+</p>
+<ul>
+ <li><tt>out</tt> de type <tt>JspWrite</tt>
+ (comme <tt>System.out</tt> mais écrit dans la page Web générée
+ </li>
+ <li><tt>session</tt> de type <tt>HttpSession</tt> : permet de
+ définir et récupérer des variables de sessions (i.e. Objets que l'on
+ stocke « globalement » et que l'on peut récupérer d'une page à
+ l'autre)</li>
+ <li><tt>request</tt> de type <tt>HttpServletRequest</tt> : permet
+ de récupérer les paramètres passés dans une requête HTTP (par
+ exemple les valeurs d'un formulaire)</li>
+ <li><tt>response</tt> de type <tt>HttpServletResponse</tt> : permet
+ de spécialiser la réponse envoyée au client (en-têtes HTTP,
+ cookies, …)</li>
+</ul>
+</div>
+
+<div class="sws-slide">
+ <h1>Classe JspWriter</h1>
+ <p>Fonctionne comme <tt>System.out</tt> (on peut donc
+ appeler <tt>.print/.println</tt>) mais correspond a un endroit
+ particulier de la page HTML</p>
+</div>
+
+<div class="sws-slide">
+<h1>Classe HttpSession</h1>
+<p>Propose plusieurs méthodes : </p>
+<code style="background:white"> //Renvoie la valeur stockée sous le nom name
+ Object <u>getAttribute</u>(String name)
+
+ //Stocke l'objet value sous le nom name
+ void <u>setAttribute</u>(String name, Object value)
+
+ //Supprime l'association name value
+ void <u>removeAttribute</u>(String name)
+
+ //Définit la durée (en secondes) d'inactivité d'une session
+ void <u>setMaxInactiveInterval</u>(int interval)
+
+ //Renvoie la durée (en secondes) d'inactivité d'une session
+ int <u>getMaxInactiveInterval</u>()
+
+ //Renvoie la date (en mili-secondes depuis EPOCH) de dernière utilisation
+ long <u>getLastAccessedTime</u>()
+
+ //Détruit la session en cours
+ void <u>invalidate</u>()</code>
+</div>
+<div class="sws-slide">
+<h1>Classe HttpServletRequest</h1>
+<p>Propose plusieurs méthodes : </p>
+<code style="background:white"> //Récupère la valeur des cookies:
+ String[] <u>getCookies()</u>
+
+ //Récupère les paramètres passés par un formulaire :
+ Map<String, String[]><u>getParameterMap</u>()
+
+ //Récupère un paramètre particulier
+ String[]<u>getParameter</u>(String name)
+</code>
+</div>
+<div class="sws-slide">
+<h1>Classe HttpServletResponse</h1>
+<p>Propose plusieurs méthodes : </p>
+<code style="background:white"> //Renvoie une erreur HTTP (404 par exemple)
+ void <u>sendError(int code)</u>
+
+ //Ajoute un cookie au site
+ void <u>addCookie</u>(Cookie c)
+
+ //Effectue une redirection temporaire
+ void <u>sendRedirect</u>(String url)
+</code>
+</div>
+<div class="sws-slide">
+<h1>Classe Cookie</h1>
+<p>Propose plusieurs méthodes : </p>
+<code style="background:white"> //Constructeur
+ <u>Cookie</u>(String name, String value)
+
+ //Expiration en secondes
+ void <u>setMaxAge</u>(int a)
+</code>
+</div>
+<h1>Spécificités de Tomcat</h1>
+<div cass="sws-slide">
+ <h1>Chemins par défaut</h1>
+<p>Par défaut le serveur Tomcat tourne sur le port 8080 (configurable)</p>
+<ul>
+ <li><tt>/var/lib/tomcat/webapps/toto/</tt> correspond à l'URL
+ <tt>http://domaine:8080/toto</tt>
+</li>
+ <li><tt>/var/lib/tomcat/webapps/toto/WEB-INF/</tt> contient des
+ fichiers de configuration</li>
+ <li><tt>/var/lib/tomcat/webapps/toto/WEB-INF/classes/</tt> contient des
+ fichiers <tt>.class</tt> auxiliaires</li>
+</ul>
+<p>(ce sera configuré légèrement différement au PUIO)</p>
+</div>
+<h1>Accès aux classes JSP</h1>
+<div cass="sws-slide">
+ <p>Il faut avoir le fichier <tt>jsp-api.jar</tt> dans le
+ classpath</p>
+<code> javac -cp /chemin/vers/jsp-api.jar MaClasse.java </code>
+<p>On peut ensuite copier le <tt>.class</tt>
+ dans <tt>WEB-INF/classes</tt>
+</div>
+</body>
+</html>