29
Java intensif Programmation Web Serge Rosmorduc 2013-2014 Serge Rosmorduc Java intensifProgrammation Web 2013-2014 1 / 29

Java intensif Programmation Web

  • Upload
    others

  • View
    16

  • Download
    3

Embed Size (px)

Citation preview

Java intensifProgrammation Web

Serge Rosmorduc

2013-2014

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 1 / 29

Plan

Rappel : L’architecture web : client, serveur, serveur applicatif ;Une application java ;notion de servlet ;limites des servlets ;notion de jsp ; expression language ; beans request ;combinaison jsp/servlets, forwarding ;architecture du traitement d’un formulaire (detaille) ;

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 2 / 29

Rappels sur l’architecture Web

Pour HTML, formulaires... voir supports du cours NFA016 surdeptinfo.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 3 / 29

L’ecosysteme J2EE

Serveurs applicatifs a geometrie variable ; nombreux modules.Couche web : Servlets/JSP ; Wicket, JSF ;+ annuaire de services (JNDI) ;+ gestion de transactions (JTA) ; gestion de persistence (JTA) ;+ load balancing...serveurs simples : Tomcat, Jetty...serveurs complets : JBoss, Glassfish...EJB3 vs. Spring : convergence des approches

Ce cours : on reste simple, Servlets, JSP, un peu d’archi.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 4 / 29

Organisation d’une application Web

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 5 / 29

Organisation d’une application Web

L’application est typiquement compressee dans un fichier .warla racine de l’application contient :

des resources directement accessibles (pages web, images, jsp) ;un dossier nomme WEB-INF qui contient :

I un fichier de configuration web.xml ;I un dossier classes contenant des classes java (.class) ;I un dossier lib contenant des bibliotheques java (.jar) ;I ...

WEB-INF n’est pas visible depuis l’exterieur : on y range souventdes ressources qu’on veut cacher.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 6 / 29

Remarque sur Netbeans

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 7 / 29

Rappel sur la methode GET

Les donnees sont passees dans l’URL :http://www.google.com/search?q=cnam&sourceid=chrome

protocole et serveur http://www.google.compage : searchvariable(s) :

I q qui vaut � cnam � ;I sourceid qui vaut � chrome �.

Une requete en mode get est simple a construire sur un navigateurweb.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 8 / 29

Rappel sur la methode POST

Autre systeme : les donnees de la requete sont envoyees dans lecorps de la requete http.elles ne sont pas visibles.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 9 / 29

Notion de Servlet

classe java qui etend HttpServlet ;associee a une URL ;fournit deux methodes : doGet() et doPost() ;ces methodes sont supposees recuperer les requetes et yrepondre.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 10 / 29

Hello World en Servlet

1 @WebServlet (name = ” H e l l o Se rv l e t ” , u r l P a t t e r n s = { ” / h e l l o ” } )2 public class He l l oSe rv l e t extends Ht tpSe rv l e t {3 protected void doGet ( Ht tpServ le tRequest request ,4 HttpServletResponse response )5 throws Serv le tExcept ion , IOExcept ion {6 response . setContentType ( ” t e x t / html ; charset=UTF−8” ) ;7 P r i n t W r i t e r out = response . ge tWr i t e r ( ) ;8 t ry {9 out . p r i n t l n ( ”<!DOCTYPE html>” ) ;

10 out . p r i n t l n ( ”<html>” ) ;11 out . p r i n t l n ( ”<body>” ) ;12 out . p r i n t l n ( ” Bonjour ” + request . getParameter ( ”nom” ) ) ;13 out . p r i n t l n ( ”</body>” ) ;14 out . p r i n t l n ( ”</html>” ) ;15 } f i n a l l y {16 out . c lose ( ) ;17 }18 }19 }

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 11 / 29

Servlets

Annotation :@WebServlet(name = "HelloServlet",

urlPatterns = "/hello")

Dis que la servlet est associee a l’URL � /hello �

objet request : represente la requete. Permet de recuperer lesdonnees de formulaire ;methodes utiles :

I String getParameter(String) : retourne la valeur d’unparametre

I String[] getParameterValues(String) : retourne lesvaleurs d’un parametre (pour les listes, etc...)

objet reponse : ici, permet de fixer le type et le codage de lareponse, ainsi que son contenu.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 12 / 29

Limitation des servlets

Generation de HTML tres lourde ;Le HTML est melange au java :

I mauvaise separation affichage/traitements ;I pas adapte a une separation des taches

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 13 / 29

Les JSP

En gros, HTML avec des vrais morceaux de java dedans.

Balises specifiques<% ...%> : introduit des instructions java ; <%= ... %> : introduitdes expressions java, dont le resultat est affiche. ;

Objets disponiblesout : permet d’ecrire (JspWriter)request : objet requete ;response : objet reponse ;session : objet representant la session ;application : represente l’application web.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 14 / 29

JSP, exemple

1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset= ”UTF−8”>5 < t i t l e >JSP</ t i t l e >6 </head>7 <body>8 <p>Bonjour <%= request . getParameter ( ”nom” ) %></p>9

10 <p>11 <%12 for ( i n t i = 0 ; i < 100; i ++) {13 out . p r i n t ( ”−” ) ;14 }15 %>16 </body>17 </html>

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 15 / 29

Utilisation propre de tout ca

La servlet :I c’est du java (chic !)I recoit la requete ;I delegue le traitement a des classes � metier � (parce que le web

c’est l’enfer) ;I delegue l’affichage a une JSP

La JSP :I melange du HTML et du code ;I ne calcule rien du tout.I se contente d’afficher les donnees transmises par la servlet.

avantages : elements developpables separement, testablesseparements.

En pratique...

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 16 / 29

Transmettre la main a une JSP depuis une servlet

Exemple : affichage du nom d’une personne capitalise.On utilise un RequestDispatcher dans la servlet....

1 public class Hel lo2 extends Ht tpSe rv l e t {2 protected void doGet ( Ht tpServ le tRequest request ,3 HttpServletResponse response )4 throws Serv le tExcept ion , IOExcept ion {5 / / Recuperat ion des parametres6 S t r i n g nom = request . getParameter ( ”nom” ) ;7 / / Tra i tement : une classe me t ie r . . .8 S t r i n g nomCap= NomHelper . c a p i t a l i s e r (nom ) ;9 / / On transmet les donnees

10 / / a a f f i c h e r comme ” beans request ”11 request . s e t A t t r i b u t e ( ” nomCapi ta l ise ” , nomCap ) ;12 / / On cree l e d ispa tcher13 RequestDispatcher r =14 request . getRequestDispatcher ( ” /WEB−INF / j sp / he l l o2 . j sp ” ) ;15 / / On passe l a main a l a s e r v l e t16 r . forward ( request , response ) ;17 }18 }

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 17 / 29

Commentaires

La capitalisation n’est pas si simple (nom null, nom de taille 0 ou1)...on la sort de la servlet, qui doit etre le moins intelligente possible→ creation d’une classe NomHelper

la methode est statique, mais c’est juste parce que l’exemple estsimple ;separee de la servlet, elle peut etre testee seule ;on calcule les donnees a afficher (ici nomCap), et on les transmeta la jsp comme beans request a l’aide de la methode

request.setAttribute(ident, valeur)

I ident est un identifiant pour designer l’attribut ;I valeur est un objet quelconque (pas forcement une String)

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 18 / 29

RequestDispatcher

Sert a demander a une JSP de terminer le traitement de la requete.

Utilisation

1 S t r i n g chemin= ” /WEB−INF / j sp / he l l o2 . j sp ” ;2 RequestDispatcher r =3 request . getRequestDispatcher ( chemin ) ;4 r . forward ( request , response ) ;

chemin : page qui traite l’affichage. Tres souvent une JSP, placeedans WEB-INF.r.forward(request,response) expedie la requete courantea cette nouvelle page.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 19 / 29

L’expression language (premiere approche)

Dans la JSP, on peut ecrire :

1 <%= request . g e t A t t r i b u t e ( ” nomCapi ta l ise ” ) %>

Mais c’est long et peu lisible.de plus, on souhaite eliminer le code java des JSP : la JSP ne faitque de l’affichage.Un langage special est disponible : ${nomCapitalise} affichela valeur du bean.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 20 / 29

Proprietes des beans

Quand un bean est un objet avec des accesseurs... ;par exemple un bean personne de classe Personne avec lesaccesseurs getNom() et getPrenom() ;alors ${personne.nom} affiche le nom de la personne enappelant personne.getNom()

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 21 / 29

hello2.jsp

1 <!DOCTYPE html>2 <html>3 <head>4 < t i t l e >JSP Page</ t i t l e >5 </head>6 <body>7 Bonjour ${nomCapi ta l ise}8 </body>9 </html>

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 22 / 29

Recapitulation

la servlet recoit une requete, extrait les arguments, et decide quoifaire ;elle delegue le traitement effectif a des classes metiers, qui neconnaissent rien du web ;puis elle range les valeurs a afficher dans des beans request,enfin, elle passe la main a une JSP.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 23 / 29

Deuxieme partie II

Du traitement des formulaires

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 24 / 29

Formulaire, exemple

Application quiI saisit le nom et le prenom d’une personne ;I verifie que les champs sont remplis ;I calcule le texte de la salutation ;I l’affiche avec une jsp ;I reaffiche le formulaire avec des messsages d’erreur et les donnees

erronees en cas de probleme.

C’est la meme servlet qui affiche le formulaire et le traite.deux jsp : le formulaire et le resultat.souvent, doGet() est appele pour le premier affichage, etdoPost pour les traitements.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 25 / 29

Servlet1 public class Saluer extends Ht tpSe rv l e t {2 protected void doGet ( . . . . . . . . . ) {3 / / A p r i o r i , premier appel . . .4 req . getRequestDispatcher ( ” /WEB−INF / j sp / saluerForm . j sp ” )5 . forward ( req , resp ) ;6 }78 protected void doPost ( . . . . . . . . . . ) {9 S t r i n g j sp ;

10 S t r i n g nom= req . getParameter ( ”nom” ) ;11 S t r i n g prenom= req . getParameter ( ” prenom ” ) ;12 i f (nom == nul l | | prenom == nul l | |13 ” ” . equals (nom) | | ” ” . equals ( prenom ) ) {14 req . s e t A t t r i b u t e ( ” message ” ,15 ” les champs do iven t e t r e rempl i s ” ) ;16 j sp= ” /WEB−INF / j sp / saluerForm . j sp ” ;17 } else {18 req . s e t A t t r i b u t e ( ”nom” , nom. toUpperCase ( ) ) ;19 req . s e t A t t r i b u t e ( ” prenom ” , prenom ) ;20 jsp= ” /WEB−INF / j sp / sa luer . j sp ” ;21 }22 req . getRequestDispatcher ( j sp ) . forward ( req , resp ) ;23 }24 }

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 26 / 29

JSP formulaire1 <%@page contentType= ” t e x t / html ” pageEncoding= ”UTF−8”%>2 <!DOCTYPE html>3 <html>4 <head>5 < t i t l e >Saluer </ t i t l e >6 </head>7 <body>8 <p s t y l e = ” co lo r : red ”>${message}</p>9 <form method= ”POST”>

10 <p>nom :11 <i npu t type= ” t e x t ” name= ”nom” value= ” ${param .nom} ” /></p>12 <p>prenom :13 <i npu t type= ” t e x t ” name= ” prenom ” value= ” ${param . prenom} ” /></p>14 <p><i npu t type= ” submit ” /></p>15 </ form>16 </body>17 </html>

Noter que quand ${message} est absent, ca ne pose pas deprobleme...${param.nom} : valeur du parametre nom (et non de l’attribut) :valeur provenant du formulaire qu’on traite.

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 27 / 29

Amelioration : gestion des erreurs par tableau1 protected void doPost ( . . . . ) {2 S t r i n g j sp ;3 HashMap<St r ing , S t r ing> er reu rs= new HashMap<St r ing , S t r ing > ( ) ;4 S t r i n g nom= req . getParameter ( ”nom” ) ;5 S t r i n g prenom= req . getParameter ( ” prenom ” ) ;67 i f (nom == nul l | | ” ” . equals (nom ) ) {8 er reu rs . put ( ”nom” , ” ce champ d o i t e t r e remp l i ” ) ;9 }

10 i f ( prenom == nul l | | ” ” . equals ( prenom ) ) {11 er reu rs . put ( ” prenom ” , ” ce champ d o i t e t r e remp l i ” ) ;12 }1314 i f ( ! e r reu rs . isEmpty ( ) ) {15 req . s e t A t t r i b u t e ( ” e r reu rs ” , e r reu rs ) ;16 j sp= ” /WEB−INF / j sp / saluerForm1 . j sp ” ;17 } else {18 req . s e t A t t r i b u t e ( ”nom” , nom. toUpperCase ( ) ) ;19 req . s e t A t t r i b u t e ( ” prenom ” , prenom ) ;20 jsp= ” /WEB−INF / j sp / sa luer . j sp ” ;21 }22 req . getRequestDispatcher ( j sp ) . forward ( req , resp ) ;

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 28 / 29

Nouvelle version de la JSP1 <%@page contentType= ” t e x t / html ” pageEncoding= ”UTF−8”%>2 <!DOCTYPE html>3 <html>4 <head>5 <meta charset= ”UTF−8”>6 < t i t l e >Saluer </ t i t l e >7 <s t y l e>8 . e r reu r { co lo r : red ;}9 </ s t y l e>

10 </head>11 <body>12 <form method= ”POST”>13 <p>nom : <i npu t type= ” t e x t ” name= ”nom” value= ” ${param .nom} ” />14 <span class= ” e r reu r ”> ${er reu rs .nom}</span>15 </p>16 <p>prenom : <i npu t type= ” t e x t ” name= ” prenom ”17 value= ” ${param . prenom} ” />18 <span class= ” e r reu r ”> ${er reu rs . prenom}</span>19 </p>20 <p><i npu t type= ” submit ” /></p>21 </ form>22 </body>23 </html>

Serge Rosmorduc Java intensifProgrammation Web 2013-2014 29 / 29