Java Edition Entreprise-2009_2010

Embed Size (px)

Citation preview

  • 8/7/2019 Java Edition Entreprise-2009_2010

    1/114

    Java EE

    Java Edition Entreprise

  • 8/7/2019 Java Edition Entreprise-2009_2010

    2/114

    Prsentation du cours

    36h sur 12 semaines

    Objectifs

    Dveloppement dapplications Web robustesutilisation dun framework (standard)

    Apprentissage dune partie de Java EEServlet, JSP et EJB

    Prrequis

    Matrise du langage Java (Java SE)

    Matrise du dveloppement Web client XHTML (au moins balises de structure et formulaires)

    CSS et XML sont un plus

  • 8/7/2019 Java Edition Entreprise-2009_2010

    3/114

    Java EE?

    Java Enterprise Edition est un framework riche (Java SE + nombreuses API)

    ouvert (specs. du Java Community Process)

    ddi au dveloppement, au dploiement et lexcutiondapplications Internet modernes (ncessaires auxentreprises)

    Favorise la sparation des proccupations Code mtier vs. Proprits non-fonctionnellespersistance (JPA), administration (JMX), scurit,

    transaction

    (JTS/JTA),

  • 8/7/2019 Java Edition Entreprise-2009_2010

    4/114

    Le dveloppement Web Le World Wide Web

    Un SI public et universel dploy sur Internet Un langage : HTML (ou XHTML) Un modle de communication : client-serveur Un protocole : HTTP

    Pages statiques Pages HTML prpares lavance

    Le serveur renvoie les pages sans effectuer de traitementParticulier

    Pages dynamiques Pages HTML gnres par le serveur Le serveur construit la rponse en fonction de la requte delutilisateur

  • 8/7/2019 Java Edition Entreprise-2009_2010

    5/114

    Java et le dveloppement Web

    Diffrentes technologies Java permettent defaire du

    dveloppement Web diffrents niveaux.

    DveloppementCt client Ct serveur

    applet Servlet

    JavaScript JSP

    Pages statiques Pages dynamiques

    Classe autonome

    Java mix avecHTML

  • 8/7/2019 Java Edition Entreprise-2009_2010

    6/114

    HTML (rappel)

    Langage de balisage, non propritaire Conu pour afficher des documents sur le Web

    Liens hypertextes possibles entre les documents

    XHTML assure maintentant la compatibilit avec XML

    Titre de mon document

    ...

  • 8/7/2019 Java Edition Entreprise-2009_2010

    7/114

    Quelques balises

  • 8/7/2019 Java Edition Entreprise-2009_2010

    8/114

  • 8/7/2019 Java Edition Entreprise-2009_2010

    9/114

    Limites dun serveur Web seul

    Pas de contenu dynamique

    Pas de sauvegarde de donnes sur le serveur

    Traitemenent de formulaires : besoin dune application daide au serveur Web

    pour valuer les paramtres reus

    pour gnrer une rponse approprie

  • 8/7/2019 Java Edition Entreprise-2009_2010

    10/114

    Pages dynamiques

    Le serveur Web a besoin daide pour faire du dynamique

    Autrefois, les CGI (Common Gateway Interface)

    Aujourdhui, un conteneur Java EE avec servlets (ex :Tomcat)

  • 8/7/2019 Java Edition Entreprise-2009_2010

    11/114

    Introduction aux servlets

  • 8/7/2019 Java Edition Entreprise-2009_2010

    12/114

    Conteneur La notion de conteneur se retrouve dans de nombreuses

    technologies Servlet, Applet, MIDlet, Xlet, (*-let), EJB,

    Un conteneur est un composant logiciel systme qui contrledautres composants, dits mtier Tomcat est un exemple de conteneur

    Les servlets nont pas de mthode main(), ils sont contrls par leconteneur

    Tomcat

    Les requtes ne sont pas adresses aux servlets mais au conteneurdans lequel ils sont

    dploys

    P i ?

  • 8/7/2019 Java Edition Entreprise-2009_2010

    13/114

    Pourquoi un conteneur ?

    Pour oublier le cours de rseau !

    Un conteneur fournit pour les Servlets

    Un support pour la communication Pas besoin de ServerSocket, Socket, Stream,

    La gestion du cycle de vie

    Un support pour le Multithreading

    Cration automatique des Threads

    Un support pour la scurit

    Un support pour les JSP

    Notion de module Web Un servlet ne peut pas tre dploy directement dans un

    conteneur, il doit faire partie dun module Web Un module Web est un ensemble de librairies, de fichiers de

    configurations, de code Java (bytecode des servlets),

    Le module Web est lunit de dploiement dans le conteneur

  • 8/7/2019 Java Edition Entreprise-2009_2010

    14/114

    Servlet en 4 tapes (1/4)

    Projet

    srcWebConten

    t

    WEB-

    INF

    Clock.java

    Web.xml

    Crer larborescence suivante

    Impos parla spcificatides servlets

    Dynamic web project

  • 8/7/2019 Java Edition Entreprise-2009_2010

    15/114

    Servlet en 4 tapes (2/4)package ensat.cours.tp;

    import java.io.*;

    import javax.servlet.http.*;import javax.servlet.*;

    public class Clock extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse reponse)

    throws IOException, ServletException{

    String title = "Clock";String doctype ="";

    reponse.setContentType("text/html");

    PrintWriter out = reponse.getWriter();

    out.println(doctype +

    ""+title+""+"Time On Server"+"
    "+

    new java.util.Date() +"");

    out.close();

    }

    }

    Ecrire servlet Clock et le mettre danssrc

    Redfinitionde la

    mthodedoGet

    Code

    htmlincorpordans du

    java

  • 8/7/2019 Java Edition Entreprise-2009_2010

    16/114

    Servlet en 4 tapes (3/4)

    WebModule1

    index.html

    The Clock

    ensat.cours.tp.Clock

    The Clock

    /Serv1

    Servlet-name permet de lieret

    nom utilis parlutilisateur dans sa

    requte

    Crer un descripteur de dploiement etle mettre dans WEB-INF

  • 8/7/2019 Java Edition Entreprise-2009_2010

    17/114

    Servlet en 4 tapes (4/4)

    Dmarrer le serveur (Tomcat) Compiler la servlet

    Lancer un navigateur et taper http://localhost:8080/Projet/Serv1

    http://localhost:8080/Projet/Serv1http://localhost:8080/Projet/Serv1
  • 8/7/2019 Java Edition Entreprise-2009_2010

    18/114

    C l d i d l t

  • 8/7/2019 Java Edition Entreprise-2009_2010

    19/114

    Cycle de vie dun servlet

    1. Chargement de la classe

    2. Instanciation du servlet

    constructeur par dfaut

    3. Appel de init()

    4. Appel(s) de service() 1 thread parrequte

    5. Appel de destroy()

  • 8/7/2019 Java Edition Entreprise-2009_2010

    20/114

    La mthode service() Lors de la rception dune requte, le conteneur cre

    un objet ServletRequest (la requte), et

    un objet ServletResponse (la rponse)

    Le conteneur appelle ensuite la mthode service() avec ces deux objets en paramtres pourpermettre au servlet de rpondre la requte du client

    Requtes HTTP (rappel) Deux mthodes principales : GET et POST

    Servlets HTTP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    21/114

    Servlets HTTP

    Requtes et Rponses HTTP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    22/114

    Requtes et Rponses HTTP

    Enttes dune requte GET

  • 8/7/2019 Java Edition Entreprise-2009_2010

    23/114

    Enttes d une requte GETpublic class ShowRequestHeaders extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws

    IOException {

    //...

    out.println(doctype +

    "\n" + title + "\n" +

    "\n" + title + "\n" +

    "Request Method: " + request.getMethod() + "
    \n" +

    "Request URI: " + request.getRequestURI() + "
    \n" +

    "Request Protocol: " + request.getProtocol() + "
    )

    out.println("\n" +"Header NameHeader Value");

    Enumeration headerNames = request.getHeaderNames();

    while(headerNames.hasMoreElements()) {

    String headerName = headerNames.nextElement();

    out.println("" + headerName + "");

    out.println("" + request.getHeader(headerName) +"");

    }

    out.println("\n");

    out.close();

    }}

    h

  • 8/7/2019 Java Edition Entreprise-2009_2010

    24/114

    changer

    Enttes dune requte POST

  • 8/7/2019 Java Edition Entreprise-2009_2010

    25/114

    Enttes d une requte POST

    public class ShowRequestHeaders extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponseresponse) throws IOException {

    doGet(request,response);

    }

    }

    Formulaire GET

  • 8/7/2019 Java Edition Entreprise-2009_2010

    26/114

    Formulaire GET

    Nom: Prnom:

  • 8/7/2019 Java Edition Entreprise-2009_2010

    27/114

    Traitement formulaire GET

    public class LogServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)

    throws IOException {

    String login =request.getParameter("nom") ;String password =request.getParameter("prenom");

    //WhatYouWantif (checkUserAndPassword(login, password)) {grantAccessTo(login);} else {

    sendAuthentificationFailure(login);}

    }

    }

    GET

    Get http://localhost:8080/WebModule1/Serv2?nom=houda&prenom=Belmokadem HTTP/1.1

    host:localhost:8080user-agent:Mozilla/4.0accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*accept-language:fr

    ...

    F l i POST

  • 8/7/2019 Java Edition Entreprise-2009_2010

    28/114

    Formulaire POST

    Nom: Prnom:

  • 8/7/2019 Java Edition Entreprise-2009_2010

    29/114

    Traitement formulaire Post

    public class LogServlet extends HttpServlet {

    public void doPost(HttpServletRequest request,HttpServletResponse

    response) throws IOException {doGet(request, reponse);

    }

    }

    GET

    Post http://localhost:8080/WebModule1/Serv2 HTTP/1.1host:localhost:8080

    user-agent:Mozilla/4.0accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*accept-language:fr...

    content-type:application/x-www-form-urlencodedcontent-length:27

    Paramtres de formulaires

  • 8/7/2019 Java Edition Entreprise-2009_2010

    30/114

    Paramtres de formulairespublic class ParametresFormulaire extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse reponse) throws IOException,ServletException{

    out.println(doctype+ ""+title+""+ "");

    Enumeration paramtres = request.getParameterNames();

    if(!paramtres.hasMoreElements())

    out.println("il n'existe pas de paramtre dans la requte du client" +"+");

    else{

    out.println(request.getQueryString()+

    "
    ParamtreValeur");

    while(paramtres.hasMoreElements()){String param = (String) paramtres.nextElement();

    out.println(""+param+"");

    String[] paramValues = request.getParameterValues(param);

    for(int i=0; i

  • 8/7/2019 Java Edition Entreprise-2009_2010

    31/114

    Vrification de donnesmanquantes

    Champ manquant dans le formulaire

    getParameter retourne null

    Champ renvoy vide

    getParameter retourne une chaine vide (ou une chaine avec desespacements)

    String param = request.getParameter("someName");

    if ((param == null) || (param.trim().equals(""))) {

    doSomethingForMissingValues(...);

    } else {

    doSomethingWithParameter(param);

    }

  • 8/7/2019 Java Edition Entreprise-2009_2010

    32/114

  • 8/7/2019 Java Edition Entreprise-2009_2010

    33/114

    Exemple : Upload simple ()

    //Tlcharger un fichier txt et lafficher dans la rponse de la servlet

    if ( ServletFileUpload.isMultipartContent(request) ) {

    // create a factory for disk-based (large) file items

    FileItemFactory fileItemFactory = new DiskFileItemFactory() ;

    ((DiskFileItemFactory) fileItemFactory).setSizeThreshold(40960); //the unit isbytes

    // create a new file upload handler

    ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);

    servletFileUpload.setSizeMax(81920); // the unit is bytes

  • 8/7/2019 Java Edition Entreprise-2009_2010

    34/114

    Rponse HTTP (rappel)

  • 8/7/2019 Java Edition Entreprise-2009_2010

    35/114

    Rponse HTTP (rappel)

    Une rponse HTTP peut contenir du HTML

    HTTP rajoute des (meta)informations en entte du contenu de la

    rponse

    Status Codes

  • 8/7/2019 Java Edition Entreprise-2009_2010

    36/114

    Status Codes

    response.setStatus(int statusCode)

    Utiliser les constantes, pas dentiers directement

    Noms drivs du message standard Ex : SC_OK, SC_NOT_FOUND, etc

    response.sendError(int code, String msg) Englobe le message dans un petit document HTML

    response.sendRedirect(String url)

    Le code de status est alors 301 Lattribut Location est galement gnr dans

    lentte de la rponse

  • 8/7/2019 Java Edition Entreprise-2009_2010

    37/114

    Exemple sendErrorpublic class LogServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws IOException {String login = request.getParameter("param1") ;

    String password = request.getParameter("param2") ;

    if ((login == null) || (login.trim().equals(""))) {

    response.sendError(HttpServletResponse.SC_NOT_FOUND,champslogin

    vide");

    return;

    }

    if (checkUserAndPassword(login, password)) {

    grantAccessTo(login);

    } else {

    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, accsrefuser

    au compte" + login);

    }

    }

    }

    Exemple sendRedirect

  • 8/7/2019 Java Edition Entreprise-2009_2010

    38/114

    Exemple sendRedirectpublic class WrongDestination extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse

    response)throws ServletException, IOException {

    String userAgent = request.getHeader("User-Agent");

    if ((userAgent != null) &&(userAgent.contains("MSIE")) {

    response.sendRedirect("http://home.netscape.com");

    }

    else {

    response.sendRedirect("http://www.microsoft.com");

    }

    }

    }

    Mme URL de dpart ensuite une redirection ...

    Gnrer un fichier Excel

  • 8/7/2019 Java Edition Entreprise-2009_2010

    39/114

    Gnrer un fichier Excel

    public class FichierExcel extends HttpServlet {

    public void doGet(HttpServletRequest requete, HttpServletResponse

    reponse) throws IOException,ServletException{reponse.setContentType("application/vnd.ms-excel");

    PrintWriter out = reponse.getWriter();

    out.println("\tQ1\tQ2\tQ3\tQ4\tTotal");

    out.println("Apples\t78\t87\t92\t29\t=SOMME(B2:E2)");

    out.println("Oranges\t77\t86\t93\t30\t=SOMME(B3:E3)");

    }

    }

  • 8/7/2019 Java Edition Entreprise-2009_2010

    40/114

    TP: introductions auxServlets

  • 8/7/2019 Java Edition Entreprise-2009_2010

    41/114

    JSP: Java Server Pages

    Introduction aux JSP

    Problme : HTML dans Java

  • 8/7/2019 Java Edition Entreprise-2009_2010

    42/114

    Problme : HTML dans Java Cest laid !

    out.println(docType);out.println("");

    out.println("\nClock\n");

    out.println("\n" +

    "Time on server\n" +

    "

    " + today + "

    \n" +

    "");

    out.println("");

    Les ingnieurs connaissent Java, mais lesdveloppeurs Web, NON !!

    Difficile de sparer les diffrentes tches dudveloppement(code Web vs. code mtier)

    Solution : Java dans HTML

  • 8/7/2019 Java Edition Entreprise-2009_2010

    43/114

    Solution : Java dans HTML

    Une JSP est identique une page HTML sauf

    que lon peut rajouter du Java dedans

    Clock

    Time on server

  • 8/7/2019 Java Edition Entreprise-2009_2010

    44/114

  • 8/7/2019 Java Edition Entreprise-2009_2010

    45/114

    Cycle de vie dune JSP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    46/114

    Cycle de vie d une JSP

    Correspondance JSP/Servlet

  • 8/7/2019 Java Edition Entreprise-2009_2010

    47/114

    Correspondance JSP/Servlet JSP dorigine

    Servlet gnre par Tomcat $ECLIPSEWORKDIR\.metadata\.plugins\org.eclipse.wst.server.core\tmpX\

    work\Catalina\localhost\MonProjet\org\apache\jsp

    Stratgie de conception :

  • 8/7/2019 Java Edition Entreprise-2009_2010

    48/114

    Stratgie de conception :Limiter le code Java dans les JSP

    Deux options Ecrire 25 lignes de code directement dans une JSP

    Ecrire ces 25 lignes dans une classe Java part et1 ligne dansune JSP

    pour linvoquer

    Pourquoi la 2e option est vraiment meilleure ? Dveloppement. Ecriture de la classe dans un environnement

    Java et pas HTML

    Dbogage. Sil y a des erreurs, elles sont visibles lacompilation

    Test. Laccs la classe Java facilite le test

    Rutilisation. Utilisation de la mme classe dans diffrentespages JSP

    Syntaxe de base

  • 8/7/2019 Java Edition Entreprise-2009_2010

    49/114

    Syntaxe de base

    Texte HTML

    Blah

    Pass au client. Rellement traduit en servlet par le codeout.print("Blah");

    Commentaires HTML

    Pareil que les autres lments HTML : passs au client Commentaires JSP

    Ne sont pas envoys au client

    Pour obtenir

  • 8/7/2019 Java Edition Entreprise-2009_2010

    50/114

    Types des lments de scripts Expressions

    Format :

    Evalue et insre dans la sortie du servlet se traduit parout.print(expression)

    Scriptlets Format :

    Insr tel quel dans la mthode _jspService du servlet

    (appele parservice)

    Dclarations Format :

    Insre telle quelle dans le corps de la classe servlet, en

    dehors

    de toute mthode existante

    Syntaxe XMLVoir la fin des transparents pour la compatibilit avec XML

  • 8/7/2019 Java Edition Entreprise-2009_2010

    51/114

    Expressions JSP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    52/114

    Expressions JSP

    Format

    Rsultat Expression value, convertie en String, et place dans la page

    HTML la place quelle occupe dans la JSP Lexpression est place dans _jspService en paramtre du

    out.print()

    Exemples Heure courante : Hostname:

    Syntaxe compatible XML Java Expression

    On ne peut pas mixer les deux versions dans une mme page. Ilfaut

    utiliser XML pour la page entire si on utilise jsp:expression (Voir

    les

    Correspondance JSP/Servlet

  • 8/7/2019 Java Edition Entreprise-2009_2010

    53/114

    Correspondance JSP/Servlet

    JSP dorigine

    Un nombre alatoire

    Code du servlet rsultant de la traduction

    public void _jspService(HttpServletRequest request,HttpServletResponse response)

    throws ServletException, IOException {response.setContentType("text/html");JspWriter out = response.getWriter();out.println("Un nombre alatoire");

    out.println(Math.random());...}

    Expressions JSP : Exemple

  • 8/7/2019 Java Edition Entreprise-2009_2010

    54/114

    Expressions JSP : Exemple

    JSP Expressions

    Current time: Server: The testParam form parameter:

  • 8/7/2019 Java Edition Entreprise-2009_2010

    55/114

    Exemple : Lire 3 paramtres (JSP)

  • 8/7/2019 Java Edition Entreprise-2009_2010

    56/114

    Exemple : Lire 3 paramtres (JSP)

    Reading Three Request Parameters

    Reading Three Request Parameters

    param1:

    param2:

    param3:

  • 8/7/2019 Java Edition Entreprise-2009_2010

    57/114

    Scriptlets JSP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    58/114

    p Format

    Rsultat

    Code insr tel quel dans _jspService()

    Exemple

    Syntaxe XML

    Code Java

  • 8/7/2019 Java Edition Entreprise-2009_2010

    59/114

    Scriptlets JSP: Exemple

  • 8/7/2019 Java Edition Entreprise-2009_2010

    60/114

    p p On veut permettre lutilisateurde choisir la couleur de fond de la page

    HTML

    Color Testing

    Testing a Background of "".

    Utilisation des scriptlets pour

  • 8/7/2019 Java Edition Entreprise-2009_2010

    61/114

    p pcrer des parties conditionnelles Postulat

    Les scriplets sont insrs tels quels dans le servlet Pas besoin davoirdes expressions Java compltes Cependant, les expressions compltes sont la plupart du temps plus

    claires et faciles

    maintenir

    Exemple

    Vous avez gagn !

    Vous avez perdu !

    Code du servlet rsultant de la traductionif (Math.random() < 0.5) {out.println("Vous avez gagn !");

    } else {

    out.println("Vous avez perdu !");}

  • 8/7/2019 Java Edition Entreprise-2009_2010

    62/114

    Dclaration JSP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    63/114

    Correspondance JSP/Servlet

  • 8/7/2019 Java Edition Entreprise-2009_2010

    64/114

    p

    JSP dorigine

    Some Heading

    (Alternative : crer randomHeading en mthode

    statique dansune classe Java spare)

    Correspondance JSP/Servlet

  • 8/7/2019 Java Edition Entreprise-2009_2010

    65/114

    p Code du servlet rsultant de la traduction

    public class MyJSP_jsp implements HttpJspPage {private String randomHeading() {return("" + Math.random() + "");}

    public void _jspService(HttpServletRequest request,HttpServletResponse

    response) throws ServletException, IOException {response.setContentType("text/html");HttpSession session = request.getSession();JspWriter out = response.getWriter();out.println("Some Heading");out.println(randomHeading());

    }

    }

    Dclarations JSP : Exemple

  • 8/7/2019 Java Edition Entreprise-2009_2010

    66/114

    p

    JSP Declarations

    JSP Declarations

    Accesses to page since server reboot:

    Mthodes jspInit et jspDestroy

  • 8/7/2019 Java Edition Entreprise-2009_2010

    67/114

    j p j p y

    Les mthodes jspInit() and jspDestroy() sont dfinir par lauteurde la page JSP, contrairement la mthode _jspService() qui est gnreautomatiquement par le conteneur.

    jspDestroy() est excut la fin de cycle de laJSP.

    jspInit() est excut lors du premier appel de laJSP.

    La servlet auto-gnre garantie que ces deuxmthodes seront appeles depuis init et destroy.

    Dclarations JSP et variables

  • 8/7/2019 Java Edition Entreprise-2009_2010

    68/114

    prdfinies Rq1: Problme

    Les variables prdfines (request, response, out, session,etc.)sont locales la mthode _jspService.Ainsi, elles ne sont pas disponibles pour les mthodes dfinies

    pardes dclarations JSP et les mthodes des classes externes.

    Que peut-on faire ? Solution : les passer en paramtres. Ex :

    Rq 2 : println de JSPWriter lance une IOException Utiliser throws IOException pour les mthodes qui utilisent

    println

  • 8/7/2019 Java Edition Entreprise-2009_2010

    69/114

    Lattribut import

  • 8/7/2019 Java Edition Entreprise-2009_2010

    70/114

    p

    Format

    But

    Gnrer les instructions dimportation

    RemarqueBien que les pages JSP peuvent tre nimporte o sur le

    serveur, les classes

    utilises par les pages JSP doivent tre dans le rpertoire desclasses de

    lapplication Web

    Cest--dire : /WEB-INF/classes

    Les attributs contentType et

  • 8/7/2019 Java Edition Entreprise-2009_2010

    71/114

    y pageEncoding

    Format

    But

    Spcifier le type MIME de la page gnre par le servletrsultant de la page JSP

  • 8/7/2019 Java Edition Entreprise-2009_2010

    72/114

    Intgration

    des servlets et des JSP :

    Application du design pattern

    Model-View-Controller (MVC)

    Pourquoi combiner Servlets & JSP?

  • 8/7/2019 Java Edition Entreprise-2009_2010

    73/114

    Classiquement : utilisation des JSP pour faciliter ledveloppement et la maintenance du contenu HTML

    Pour du code dynamique simple, appel du codedun servlet

    partir de scripts JSP

    Pour des applications un peu plus complexes,utilisation de

    classes appeles partir de scripts JSP

    Mais a nest pas suffisant Pour des traitements complexes, dmarrer avec

    des JSP nest

    pas pratique du tout

    ourquo com ner erv ets

  • 8/7/2019 Java Edition Entreprise-2009_2010

    74/114

    Servlet seuls. Marche bien quand : Loutput est de type binaire. Ex : une image

    Il ny a pas doutput. Ex : redirections

    La forme/prsentation est variable. Ex : portail

    JSP seules. Marche bien quand : Loutput est de type caractre. Ex : HTML

    La forme/prsentation est stable.

    Architecture MVC. Ncessaire qd: Une mme requte peut donner des rsultats visuels

    rellement

    diffrents

    On dispose dune quipe de dveloppementconsquente avec

    une partie pour le dev. Web et une autre pour la logiquemtier

    On a un traitement complexe des donnes mais uneprsentation relativement fixe.

    Design-pattern: MVC

  • 8/7/2019 Java Edition Entreprise-2009_2010

    75/114

    Design-pattern: MVC

    MVC model 2:Application dans le

  • 8/7/2019 Java Edition Entreprise-2009_2010

    76/114

    cadre dInternet

    Exemple: liste de promotion

  • 8/7/2019 Java Edition Entreprise-2009_2010

    77/114

    Exemple: liste de promotion

    MVC : tape 1

  • 8/7/2019 Java Edition Entreprise-2009_2010

    78/114

    Le client rcupre un formulaire (form.html) pourpasser une requte avec paramtres (1, 2 puis3).

    Formulaire : form.html

  • 8/7/2019 Java Edition Entreprise-2009_2010

    79/114

    L'cole virtuelle de L'ENSAT

    Slectionner la promo afficherinfo3gstr3gsea3

    MVC : tape 2

  • 8/7/2019 Java Edition Entreprise-2009_2010

    80/114

    1. Le client envoie son formulaire (GET/POST avec paramtres)

    2. Le conteneur transmet au servlet correspondant (le controller)

    Controller : SelectPromo.java

  • 8/7/2019 Java Edition Entreprise-2009_2010

    81/114

    import javax.servlet.http.HttpServletResponse;

    import ensat.cours.logiquemetier.Promo;

    public class SelectPromo extends HttpServlet {

    public void doGet(HttpServletRequest re,HttpServletResponse pe)

    throws IOException, ServletException{

    ...String param = re.getParameter("promo");

    ...

    }

    }

    MVC : tape 3

  • 8/7/2019 Java Edition Entreprise-2009_2010

    82/114

    3. La servlet controller interroge le model sur info3

    4. Le model retourne au controller le rsultatcorrespondant

    Model: une classe Java

  • 8/7/2019 Java Edition Entreprise-2009_2010

    83/114

    public class Promo {

    public List getPromo(String param){

    List reponse = new ArrayList();

    if(param.equals("info3")){

    reponse.add("Houda");

    reponse.add("Rachida");

    }

    else if(param.equals("gsea3")){reponse.add("Saida");

    reponse.add("Ahmed");

    }

    else

    reponse = null;return reponse;

    }

    }

  • 8/7/2019 Java Edition Entreprise-2009_2010

    84/114

    Controller : SelectPromo.java

  • 8/7/2019 Java Edition Entreprise-2009_2010

    85/114

    String param = request.getParameter("fonction");//Promo retourn la liste correpondante au controleur

    Promo ob = new Promo();

    List list = ob.getPromo(param);

    System.out.println(" " + (list == null));

    //construit la requte puis l'envoie la vue

    request.setAttribute("liste", list);

    request.getRequestDispatcher("reponse.jsp").forward(request,reponse);

  • 8/7/2019 Java Edition Entreprise-2009_2010

    86/114

    View: resultat.jsp

  • 8/7/2019 Java Edition Entreprise-2009_2010

    87/114

    j p

  • 8/7/2019 Java Edition Entreprise-2009_2010

    88/114

    Architecture Web JEE: model2

  • 8/7/2019 Java Edition Entreprise-2009_2010

    89/114

    (MVC)

    Relation indirecte

    Architecture Web JEE: model1

  • 8/7/2019 Java Edition Entreprise-2009_2010

    90/114

    (pas MVC)

    JavaBeans ?

  • 8/7/2019 Java Edition Entreprise-2009_2010

    91/114

    Les JavaBeans sont des classes Java (POJO) quisuivent certaines conventions :

    Doivent avoir un constructeur vide (zero argument) On peut satisfaire cette contrainte soit en dfinissantexplicitement un tel

    constructeur, soit en ne spcifiant aucun constructeur

    Ne doivent pas avoir dattributs publics

    Une bonne pratique rutilisable par ailleurs La valeur des attributs doit tre manipule travers des

    mthodes getXxx et setXxx Si une classe possde une mthode getTitle qui retourne une

    String, on dit que le bean possde une proprit String nomme

    title Les proprits Boolean utilisent isXxx la place de getXxx

    Rfrence sur les beans, cf.http://java.sun.com/beans/docs/

    Pourquoi faut-il utiliser des?

  • 8/7/2019 Java Edition Entreprise-2009_2010

    92/114

    accesseurs ? Dans un bean, on ne peut pas avoir de champs

    publics

    Donc, il faut remplacerpublic String prenom;

    parprivate String prenom;

    public String getPrenom () {

    return(prenom);

    }

    public void setprenom (String prenom) {This.prenom = prenom ;

    }

    Pourquoi faut-il faire cela pour tout code Java ?

    ourquo aut- ut ser esaccesseurs ?

  • 8/7/2019 Java Edition Entreprise-2009_2010

    93/114

    accesseurs ?1. On peut imposer des contraintes sur les donnes

    2. On peut rajouter du code annexe

    public void setPrenom(String prenom) {

    this.prenom = prenom.substring(0, 1).toUpperCase()

    + prenom.substring(1, prenom.length()).toLowerCase();

    enregistrerBD();

    }

    3. On peut changer de reprsentation interne sans changer dinterface

    public void setPrenom(String prenom) {

    this.prenom = prenom.toUpperCase()enregistrerBD();

    }

    t sat on as que es eans

  • 8/7/2019 Java Edition Entreprise-2009_2010

    94/114

    jsp:useBean Cet lment permet de rendre un JavaBean accessible

    dans la page JSP.

    Utilisation :

    jsp:setProperty Cet lment modifie une proprit dun bean (i.e., appel

    dune mthode setXxx).

    Utilisation :

    jsp:getProperty

    Cet lment lit et retourne la valeur dune proprit dunbean.Utilisation :

    Approche gnrale avec des JSPet les tags jsp:useBean

  • 8/7/2019 Java Edition Entreprise-2009_2010

    95/114

    et les tags jsp:useBean

    Dans les pages JSP, il est toujours trs difficile de lire

    le mlange la fois de code HTML et de code Java. Lapproche la plus judicieuse est d'utiliser une

    criture plus proche du HTML en utilisant la syntaxedu XML tout en faisant rfrence, malgr tout, desclasses Java.Ex:

    Le webmaster s'occuperait alors des balises mettreen place sur ces diffrentes pages Web dynamiques,alors que le dveloppeur s'occuperait essentiellementde mettre en place toutes les classes ncessaires l'application Web.

    LesJavaBeanspermettent de composer une structureparticulire sur ces classes respectant un schmasstandard afin qu'ils puissent tre utiliss par lewebmaster au moyen de balises spcifiques etdoncsans code Java.

    Approche gnrale avec des JSPet les tags jsp:useBean

  • 8/7/2019 Java Edition Entreprise-2009_2010

    96/114

    et les tags jsp:useBean

    Lutilisateursoumet un formulaire vers une JSP

    La page JSP instancie un bean

    On passe des donnes de la requte au bean

    On affiche des valeurs issues des donnes de larequte

  • 8/7/2019 Java Edition Entreprise-2009_2010

    97/114

    o cat on e propr t s e ean :jsp:setProperty

  • 8/7/2019 Java Edition Entreprise-2009_2010

    98/114

    jsp:setProperty Format

    But

    Permettre de modifier les proprites dun bean

    properties (i.e.,appel de mthodes setXxx) sans programmation

    Java explicite

    Remarques

    est quivalent au scriptlet :

  • 8/7/2019 Java Edition Entreprise-2009_2010

    99/114

    jsp:getProperty Format

    But Permettre daccderproprits dun bean (i.e., appel

    de mthodes getXxx) sans programmation Javaexplicite

    Remarques

    est quivalent lexpression JSP :

    Exemple dutilisation: tape 1

  • 8/7/2019 Java Edition Entreprise-2009_2010

    100/114

    package serverbeans;

    public class StringBean {private String message = "No message specified";

    public String getMessage() {

    return(message);

    }

    public void setMessage(String message) {

    this.message = message;

    }

    }

    Les Beans doivent tre dploys dans le mme rpertoire

    que les autresclasses Java

    WEB-INF/classes/serverbeans

    Les Beans doivent toujours tre dans des packages !

    Exemple dutilisation: tape 2

  • 8/7/2019 Java Edition Entreprise-2009_2010

    101/114

    Initial value (from jsp:getProperty):

  • 8/7/2019 Java Edition Entreprise-2009_2010

    102/114

    jsp:setProperty (cas1) :conversion explicite & affectation (type int)

  • 8/7/2019 Java Edition Entreprise-2009_2010

    103/114

    conversion explicite & affectation (type int)

  • 8/7/2019 Java Edition Entreprise-2009_2010

    104/114

    conversion explicite & affectation (type double)

  • 8/7/2019 Java Edition Entreprise-2009_2010

    105/114

    association proprit/paramtre Utilisation de lattribut param de jsp:setProperty

    On indique que la valeur doit provenir du paramtrede requte spcifi

    Une conversion automatique de type est oprepour les valeurs de types standardboolean, Boolean, byte, Byte, char, Character, double,

    Double, int, Integer,

    float, Float, long, ou Long.

    jsp:setProperty (cas2) :association proprit/paramtre

  • 8/7/2019 Java Edition Entreprise-2009_2010

    106/114

    association proprit/paramtre

    ...

    ...

    jsp:setProperty (cas3) : associertoutes les proprits aux paramtres

  • 8/7/2019 Java Edition Entreprise-2009_2010

    107/114

    toutes les proprits aux paramtres Utilisation de "*" pour la valeur de lattribut property de

    jsp:setProperty

    On indique que la valeur doit provenir des paramtres de requtequi correspondent aux noms des proprits

    Un conversion automatique de type est galement opre

    Particulirement pratique pour raliser des Beans formulaires -- objets dont les proprits sont remplies par les donnes dunformulaire

    Ce processus peut mme tre dcompos entre diffrentsformulaires, chaque soumission remplissant une partie de lobjet

    Implmentation du MVC avecRequestDispatcher

  • 8/7/2019 Java Edition Entreprise-2009_2010

    108/114

    q p

    1. Dfinir les beans pour reprsenter les donnes

    2. Utiliser une servlet pour grer les requtes La servlet lit les paramtres de requtes, vrifie les

    donnes

    manquantes ou malformes, appelle le code mtier, etc.

    3. Crer les beans La servlet invoque le code mtier (spcifique

    lapplication) ou

    accde une base de donnes pour obtenir lesrsultats. Les rsultats

    sont dans les beans dfinis ltape 1

    4. Placer le bean dans la requte, la session, ou leservlet context

    La servlet appelle setAttribute sur la requte, la

    session, ou le

    Implmentation du MVC avecRequestDispatcher

  • 8/7/2019 Java Edition Entreprise-2009_2010

    109/114

    RequestDispatcher5. Transmettre la requte la JSP (forward)

    La servlet dtermine quelle JSP est approprie lasituation et

    utilise la mthode forward du RequestDispatcherpour

    transfrer le contrle la JSP

    6. Extraire les donnes des beans JSP 1.2: la JSP accde aux beans avec

    jsp:useBean et lattribut

    scope correspondant au choix de ltape 4. La JSP

    utiliseensuite jsp:getProperty pour afficher les proprits

    des beans

    JSP 2.0: la JSP utilise

    ${nameFromServlet.property} pour

    Utilisation de jsp:useBean : MVC

  • 8/7/2019 Java Edition Entreprise-2009_2010

    110/114

    La JSP ne doit pas crer les objets

    La servlet, pas la JSP, doit crer tous les objets-

    donnes. Donc,pour guarantir quune JSP ne crera pas dobjets, il

    faut utiliser

    au lieu de

    La JSP ne doit pas modifier les objets Il faut donc utiliser jsp:getProperty mais pasjsp:setProperty.

  • 8/7/2019 Java Edition Entreprise-2009_2010

    111/114

    Exemple : Partage de donnes surrequte

  • 8/7/2019 Java Edition Entreprise-2009_2010

    112/114

    requte

    ServletValueObject value = new ValueObject(...);

    request.setAttribute("key", value);

    RequestDispatcher dispatcher =

    request.getRequestDispatcher("SomePage.jsp");

    dispatcher.forward(request, response); JSP 1.2

    JSP 2.0

    ${key.someProperty}

    Partage de donnes sur requte :exemple simple

  • 8/7/2019 Java Edition Entreprise-2009_2010

    113/114

    exemple simple Servlet

    Customer myCustomer = newCustomer(request.getParameter("customerID"));

    request.setAttribute("customer", myCustomer);

    RequestDispatcher dispatcher =

    request.getRequestDispatcher("SomePage.jsp");

    dispatcher.forward(request, response);

    JSP 1.2

    JSP 2.0

    ${customer.firstName}

  • 8/7/2019 Java Edition Entreprise-2009_2010

    114/114