Staf 2x, fr, 18.01.01, staf-f\radeff\staf22\notesStaff.22.html

See also: notes on ex4
doc Java
Javaserver Page
Java fromthe Beginning (nuls)
JDBC Java
-> JavaExamples in a nutshell (O'Reilly)
Java Tutorial Sun
!Webmasterin a nutshell erreurs sur XML XSL (out of date)

exercice: http://tecfa.unige.ch/tecfa/teaching/staf2x/travaux.html#section3
JDBC - Server-side

Cours
page(+programme) installé sur le server (SSI), le servlet est unpg sur le serveur attendant les connexions CORE - Core Enterprise / Sun < extensions standard, package javax.*(eXtensions) = "chemin sous dos"
Apache (.jsp, .sxml, .servlet) ; -> Tomcat (slave d'Apache àTecfa) = server web java, renvoie à Apache

LE PROBLEME VIENT TOUJOURS DU CLASSPATH, gros écueil du débutant

il faut compiler avec javax, on peut soit le faire en local, soit posersur le serveur puis par telnet, et taper la ligne
source /local/env/java12-sql-xml-ser.csh
si on veut des détails
more /local/env/java12-sql-xml-ser.csh
un servlet = programme java, pas de différence pour l'appel avecun CGI (par un URL), mais c'est pas 1 page, c'est un programme; autre différence, une x lancé le servlet, il est 'vivant', il tourne tout le temps,pas besoin de le 'réveiller' comme un CGI donc connection initialese fait + rapidement

2.2
voir le lien
le servlet permet de faire une interface autre qu'http (wap etc), ms on bosse surtout avec
HttpServletRequestpublic class HelloServlet extends HttpServlet = on étend à la classe http

3. attention, ligne 2 (javax.servlet.*;) ne contient rien, on indique juste
aller à
guides/java/staf2x/ex/WEB-INF/classes/
ou http://tecfa.unige.ch/guides/java/staf2x/ex/WEB-INF/classes/
normalement, depuis le web, on devrait pas pouvoir aller voir pour des raisons de sécurité
methode doGet abstraite, interface qui traite la requête type 'GET' (qd le navigateur demande un fichier par http, il fait un 'get', l'autre protocole = 'post' pour envoyer le formulaire en la cachant) pour la renvoyer au servlet
protected: interdit implémentation doGet ds une sous-classe (?), on aurait pu utiliser 'public' à la place
content type: à la différence de PHP, il faut spécifier de quoi il s'agit (GIF, TXT ou autre)

out
l'écriture sur un flux de données = l'impression = à différencier (vers écran? server? imprimante?)
response = notre nom de variable sur lequel on peut écrire (on pourrait changer, mais il faut impérativement lui dire out = nomVariable.getWriter();

le reste, comme d'hab (ressemble à PHP)

on peut aussi définir une méthode qui fait de la doc

après cet exemple simple, on examine des ex. + musclés

4 (SimpleCalculServlet.java)

on implémente 1 meth doPost (pas doGet comme avant);
extraction comme JSP: variable req (on peut choisir autre chose), donne contenu 'choice' mais pas magique, il faut lui dire que c'est un String ou un nombre; pour extraire le nombre du string, on prend la classe Integer et la méthode parseInt (méth. statique donc pas besoin de faire une instanciation), ici il transforme "2" en 2; si erreur le server saute (try qui permet de capter les erreurs et de les afficher automatiquement); ici,

try {
String title = "Simple Calcul Java Servlet";
out.println ( "<html><head><title>" + title
+ "</title></head>" );
out.println ( "<body><H1>" + title + "</H1>" );

String choice = req.getParameter ( "choice" );
String choice2 = req.getParameter ( "choice2" );

out.println ("<h2>Vous avez fait les choix suivants: </h2>");
out.println ( "Choix 1: " + choice + "<BR>" );
out.println ( "Choix 2: " + choice2 + "<BR>" );

// Integer.parseInt() translates a string to an Integer
int score = Integer.parseInt(choice) + Integer.parseInt(choice2);

out.print("<h3>Votre score est de " + score + "</h3>");

if (score < 3) {
out.print ("<p>Vous êtes un débutant</p>");
} else if (score < 5) {
out.print ("<p>Vous avez un niveau moyen</p>");
} else {
out.print ("<p>Vous êtes un expert !</p>");
}

/ ///ici c'est la fin - juste après le } qui suit du 'try'
} catch // le catch est le résultat du 'try', on pourrait le développer,
il renvoie aussi les messages d'erreurs pour MySQL
( Throwable t ) {
out.println ( "<P><PRE>" );
out.println (t.getMessage());
out.println ( "</PRE><P>" );
}
attention aussi, en PHP il faut faire " . ", ici on utilise le "+" qui est plus standard d'ailleurs

ex. 4-2
on déf des var globales au niveau de la classe avant le doPost

ex. 4-3
...

ex. 4-4
comme en PHP, on fait tout en 1 fichier (all-in-one servlet)
attention. ici string html (html est une variable comme une autre ds laquelle on écrit)

5. Server Deployment: TODO
(à - d'installer le Tomcat et Cocoon at home, dur mais apprend les classpath)
chque étudiant a un contexte - son répertoire de boulot, dans lequel on définit le web-inf, dks se charge de faire comprendre à Apache de lire pour Tomcat le bon contexte, on y crée des sous-répertoires qui sont STANDARDS javas
c'est une config minimaliste, si on bosse avec Oracle, on a  besoin d'une archive, il faut mettre le .jar dans le répértoire web-inf/lib
aller voir aussi les examples tomcat:
http://tecfa.unige.ch/guides/tomcat/examples/jsp/

Pour l'exercice: - tecfasun5 - mkdir WEB-INF/classes dans travaux - source /local/env/java12-ser-xml-sql.csh - javac HelloServlet.java - ls *.class Tester http://tecfa.unige.ch/staf-f/radeff/servlet/HelloServlet