6c4e24c785d3aae803cbc1228cf4dc0b7df6d8c4
[hacks/simpleWebSlides.git] / xpi / xpi_08.xhtml
1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
4 >
5 <html xmlns="http://www.w3.org/1999/xhtml" >
6   <head>
7     <title>JSP</title>
8
9     <meta http-equiv="Content-Type"
10           content="text/html; charset=utf-8" />
11     <meta name="copyright"
12           content="Copyright &#169; 2013 Kim Nguyễn" />
13
14     <!-- Load jQuery -->
15     <script src="../jquery-1.9.1.min.js" type="text/javascript" ></script>
16     <!-- Load the library -->
17     <script src="../simpleWebSlides.js" type="text/javascript" ></script>
18
19     <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css"  media="all" />
20     <!-- Load a custom Theme, the class-element marks this style-sheet
21       a "theme" that can be swtiched dynamicaly -->
22     <link class="sws-theme" rel="stylesheet"  title="U-Psud style"  href="../themes/uPsud.css" type="text/css" />
23
24     <!-- Customize some templates and initialize -->
25     <style type="text/css">
26       .xml-tag { color: #00486c; }
27     </style>
28     <script type="text/javascript">
29       <![CDATA[
30       SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
31       SWS.Config['sws-object-deactivate'] =  SWS.Effects.objectDeactivateFadeOut;
32       SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
33
34       //Ensures that we load SWS at the very end, after MathJax has
35       //been initialized
36
37       $(window).load(function () {
38        $(".inline-xml").each(function(i, elem)
39       {
40       var jelem = $(elem);
41       var code = jelem.html();
42       code = code.replace ("<![CDATA" + "[", "").replace ("]" + "]>", "");
43       code = code.replace (/>/g, ">>>");
44       code = code.replace (/</g, "<span class='xml-tag'>&lt;");
45       code = code.replace (/>>>/g,"&gt;</span>");
46
47       jelem.html(code);
48       });
49   });
50
51       var checkSVG = function (o, i)
52       {
53             if (i >= 10 || SWS.Utils.isUndefined(o) || o == null) return;
54             var svg = o.getSVGDocument();
55             if (svg == null) {
56               setTimeout(function() { checkSVG(o, i+1); }, 200);
57             } else {
58          var alltext = $(svg).find("text");
59          alltext.css("font-family", "DIN");
60          alltext.css("font-size", "70%");
61
62             };
63       };
64       $(window).load(function() {
65       $("embed").ready(function() {
66          setTimeout(function() {
67          $("embed").each(function(i, o) { checkSVG(this,0);   });
68 }, 1000);
69         });
70      });
71       $(window).load(SWS.Presentation.init);
72
73         ]]>
74
75     </script>
76
77   </head>
78   <body>
79     <a href="xpi_07.xhtml" class="sws-previous"/>
80     <div class="sws-slide sws-cover sws-option-nofooter">
81       <h1>XML et Programmation Internet</h1>
82       <h1>Cours 8</h1>
83       <a href="mailto:kn@lri.fr">kn@lri.fr</a>
84     </div>
85     <h1>Principe</h1>
86     <div class="sws-slide">
87       <h1>Programmation Web coté serveur</h1>
88       <p>(rappel) génération de pages-web dynamiques (<i>i.e.</i> dont
89       le contenu est calculé en fonction de la requête
90       HTTP). Plusieurs choix de langage côté serveur.
91       </p>
92       <ul>
93         <li>PHP (déploiement de site très simple,
94           langage <span style="text-decoration:line-through">merdique</span>
95           particulier)
96         </li>
97         <li>Python, Ruby (manque de standardisation, plusieurs
98         framework concurrents, problèmes de performances)</li>
99         <li>ASP .NET (microsoft) </li>
100         <li><a>Java/JSP</a> (langage raisonnable, déploiement complexe)</li>
101       </ul>
102
103   </div>
104     <div class="sws-slide">
105       <h1>JSP</h1>
106       <p>JSP (Java Server Pages) est un <i>framework</i> permettant de
107         créer des pages Web dynamiques en Java. Il fait partie de la
108         suite Java EE (Entreprise Edition). Rappel :
109       </p>
110       <ul>
111         <li>Java Card (Java pour cartes de crédit, très peu de choses,
112         pas de GC)</li>
113         <li>Java ME (Micro Edition, pour les périphériques embarqués,
114         mobiles, etc.)</li>
115         <li>Java SE (Standard Edition, java « normal »)</li>
116         <li>Java EE (Entreprise Edition, SE + packages pour JSP, et autres)</li>
117       </ul>
118     </div>
119     <div class="sws-slide">
120       <h1>Architecture</h1>
121       <p>Nécessite un serveur Web particulier. Le standard est Apache Tomcat.</p>
122       <ul>
123         <li>Le programmeur écrit des fichiers <tt>.jsp</tt>, contenant
124           du HTML + du java dans des balises spéciales</li>
125         <li>(Le programmeur déploie les fichiers sur le serveur
126           Tomcat)</li>
127         <li>L'utilisateur navigue vers une page <tt>foo.jsp</tt></li>
128         <li>Le serveur Tomcat génère <tt>fooServlet.class</tt></li>
129         <li>La classe est chargée dans la JVM java et (sa métode
130           principale) est exécutée, produisant une page HTML</li>
131         <li>La page HTML est envoyée au navigateur</li>
132       </ul>
133     </div>
134     <div class="sws-slide">
135       <h1>Exemple</h1>
136       <code class="background:white;">
137  <![CDATA[<%@ page contentType="text/html; charset=UTF-8" %>
138
139  <!DOCTYPE html>
140  <html>
141  <head><title>test JSP</title>
142        <meta charset="UTF-8"/>
143  </head>
144  <body>
145  Page created on
146  <%]]>
147         java.util.Date d = new java.util.Date();
148         <s>out</s>.println(d.toString());
149  <![CDATA[%>
150  </body>
151  </html>]]></code>
152     </div>
153 <div class="sws-slide">
154 <h1>balises spéciales JSP</h1>
155 <p>JSP introduit 4 balises spéciales qui sont interprétée par le
156   serveur Tomcat.
157 </p>
158 <ul>
159   <li>Balise de configuration : <tt>&lt;%@ … %&gt;</tt> (options HTML,
160   import de packages, …)</li>
161   <li>Balise de déclarations : <tt>&lt;%! … %&gt;</tt> (déclarer des
162   attributs et des méthodes)</li>
163   <li>Balises d'instructions : <tt>&lt;% … %&gt;</tt> (permet de mettre
164   une suite d'instructions)</li>
165   <li>Balises d'expressions : <tt>&lt;%= … %&gt;</tt> (permet de mettre
166   une expression dont le résultat est converti en <tt>String</tt>)</li>
167 </ul>
168 </div>
169     <div class="sws-slide">
170       <h1>Exemple complet</h1>
171       <code style="background:white;">  <![CDATA[<%@ page contentType="text/html; charset=UTF-8" %>
172   <%@ page import="java.util.Date" %>
173   <!DOCTYPE html>
174   <html>
175   <head><title>test JSP</title>
176         <meta charset="UTF-8"/>
177   </head>
178   <%!
179          Date maDate;
180
181          Date maMethode() {
182              return new Date();
183          }
184   %>
185    <body>
186   <%
187      maDate = maMethode();
188   %>
189    Page created on <%= maDate %>
190   </body>
191   </html>]]></code>
192     </div>
193 <div class="sws-slide">
194   <h1>Objets par défaut</h1>
195 <p>Le code placé dans les balises spéciales a accès à certains objets
196   automatiquement déclarés. Parmi les principaux :
197 </p>
198 <ul>
199   <li><tt>out</tt> de type <tt>JspWrite</tt>
200   (comme <tt>System.out</tt> mais écrit dans la page Web générée
201   </li>
202   <li><tt>session</tt> de type <tt>HttpSession</tt> : permet de
203   définir et récupérer des variables de sessions (i.e. Objets que l'on
204   stocke « globalement » et que l'on peut récupérer d'une page à
205   l'autre)</li>
206   <li><tt>request</tt> de type <tt>HttpServletRequest</tt> : permet
207   de récupérer les paramètres passés dans une requête HTTP (par
208   exemple les valeurs d'un formulaire)</li>
209   <li><tt>response</tt> de type <tt>HttpServletResponse</tt> : permet
210     de spécialiser la réponse envoyée au client (en-têtes HTTP,
211     cookies, …)</li>
212 </ul>
213 </div>
214
215 <div class="sws-slide">
216   <h1>Classe JspWriter</h1>
217   <p>Fonctionne comme <tt>System.out</tt> (on peut donc
218     appeler <tt>.print/.println</tt>) mais correspond a un endroit
219     particulier de la page HTML</p>
220 </div>
221
222 <div class="sws-slide">
223 <h1>Classe HttpSession</h1>
224 <p>Propose plusieurs méthodes : </p>
225 <code style="background:white">  //Renvoie la valeur stockée sous le nom name
226   Object <u>getAttribute</u>(String name)
227
228   //Stocke l'objet value sous le nom name
229   void <u>setAttribute</u>(String name, Object value)
230
231   //Supprime l'association name value
232   void <u>removeAttribute</u>(String name)
233
234   //Définit la durée (en secondes) d'inactivité d'une session
235   void <u>setMaxInactiveInterval</u>(int interval)
236
237   //Renvoie la durée (en secondes) d'inactivité d'une session
238   int <u>getMaxInactiveInterval</u>()
239
240   //Renvoie la date (en mili-secondes depuis EPOCH) de dernière utilisation
241   long <u>getLastAccessedTime</u>()
242
243   //Détruit la session en cours
244   void <u>invalidate</u>()</code>
245 </div>
246 <div class="sws-slide">
247 <h1>Classe HttpServletRequest</h1>
248 <p>Propose plusieurs méthodes : </p>
249 <code style="background:white">  //Récupère la valeur des cookies:
250   String[] <u>getCookies()</u>
251
252   //Récupère les paramètres passés par un formulaire :
253   Map&lt;String, String[]&gt;<u>getParameterMap</u>()
254
255   //Récupère un paramètre particulier
256   String[]<u>getParameter</u>(String name)
257 </code>
258 </div>
259 <div class="sws-slide">
260 <h1>Classe HttpServletResponse</h1>
261 <p>Propose plusieurs méthodes : </p>
262 <code style="background:white">  //Renvoie une erreur HTTP (404 par exemple)
263   void <u>sendError(int code)</u>
264
265   //Ajoute un cookie au site
266   void <u>addCookie</u>(Cookie c)
267
268   //Effectue une redirection temporaire
269   void <u>sendRedirect</u>(String url)
270 </code>
271 </div>
272 <div class="sws-slide">
273 <h1>Classe Cookie</h1>
274 <p>Propose plusieurs méthodes : </p>
275 <code style="background:white">  //Constructeur
276   <u>Cookie</u>(String name, String value)
277
278   //Expiration en secondes
279   void <u>setMaxAge</u>(int a)
280 </code>
281 </div>
282 <h1>Spécificités de Tomcat</h1>
283 <div class="sws-slide">
284   <h1>Chemins par défaut</h1>
285 <p>Par défaut le serveur Tomcat tourne sur le port 8080 (configurable)</p>
286 <ul>
287   <li><tt>/var/lib/tomcat/webapps/toto/</tt> correspond à l'URL
288     <tt>http://domaine:8080/toto</tt>
289 </li>
290   <li><tt>/var/lib/tomcat/webapps/toto/WEB-INF/</tt> contient des
291   fichiers de configuration</li>
292   <li><tt>/var/lib/tomcat/webapps/toto/WEB-INF/classes/</tt> contient des
293   fichiers <tt>.class</tt> auxiliaires</li>
294 </ul>
295 <p>(ce sera configuré légèrement différement au PUIO)</p>
296 </div>
297 <h1>Accès aux classes JSP</h1>
298 <div class="sws-slide">
299   <p>Il faut avoir le fichier <tt>jsp-api.jar</tt> dans le
300   classpath</p>
301   <code> javac -cp /chemin/vers/jsp-api.jar MaClasse.java </code>
302   <p>On peut ensuite copier le <tt>.class</tt>
303   dans <tt>WEB-INF/classes</tt></p>
304 </div>
305 </body>
306 </html>