Marc Le BihanStruts 1.x1 Marc Le Bihan
Struts 1.x2 Plan I)Développement web par Servlets et JSP. II)Prise en charge de Struts. III)Principe de fonctionnement du formulaire. IV)La soumission au contrôleur.
Marc Le BihanStruts 1.x3 Construction de pages web par servlets et JSP
Marc Le BihanStruts 1.x4 La solution la plus simple pour mettre en place un site web dynamique est de construire une servlet. public class MaServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String szNom = request.getParameter("nom"); PrintWriter out = response.getWriter(); out.printf(" Bonjour %s ", szNom); out.close(); } web simpliste: la servlet (1/3)
Marc Le BihanStruts 1.x5 Mais: -Elle mélange le code de présentation (HTML) à celui de contrôle et/ou d’action. -L’émission d’HTML est assez disgracieux out.println( "…" ); -La transition d’une servlet à une autre se fait par un objet RequestDispatcher assez lourd à manipuler. web simpliste: la servlet (2/3)
Marc Le BihanStruts 1.x6 -Les champs de saisie ne sont que ceux accessibles en HTML, et ils ne peuvent pas s’auto-contrôler. -La création d’une page complexe (avec panneaux d’entête, pied, corps, etc.) est laborieuse. -Le javascript est « rude » à intégrer. web simpliste: la servlet (3/3)
Marc Le BihanStruts 1.x7 Les JSP offrent un moyen de détacher la partie présentation de la partie validation/action. "> Bienvenue Ca ne va pas Web évolué: les JSP (1/2)
Marc Le BihanStruts 1.x8 Web évolué: les JSP (2/2) Mais: -Les transitions entre pages restent délicates. -Malgré la présence de tags (dont JSTL), les scriplets Java ( ) restent nombreux et embarrassants. -Mise en page. -Capacité de validation. Les champs restent de ce que l’HTML propose.
Marc Le BihanStruts 1.x9 Pour faciliter: -La validation de pages web. -Leur agencement. -La transmission de données et la navigation de page en page. Un framework, Struts, si l’on en respecte les règles, se propose de: -Nommer les pages par des étiquettes que l’on désignera pour les atteindre. -Transmettre les données entre pages d’une manière bien délimitée. -Proposer des aides à la validation et à la mise en page. Un framework proposé
Marc Le BihanStruts 1.x10 Les variables et leur portée (1/2) Dans une page jsp, six types de variables peuvent intervenir. La variable locale: La variable membre de servlet: <jsp:useBean id="maVariable" scope="…" class="p1.p2.MaClasse"> |type="p1.p2.MaClasse" La variable de portée page, scope page, => pageContext.getAttribute( " maVariable " ); La variable de portée requête, scope request, => request.getAttribute("maVariable");
Marc Le BihanStruts 1.x11 La variable de portée session, scope session => request.getSession().getAttribute("maVariable"); La variable de portée application, scope application => pageContext.getServletContext().getAttribute("maVariable"); Seules les variables définies par ou leurs instructions java équivalentes sont accessibles par et, ainsi que par la désignation ${maVariable} dans une page JSP. Les deux autres ne le sont que par Les variables et leur portée (2/2)
Marc Le BihanStruts 1.x12 Affiche sur la page HTML le contenu de: pageContext.getAttribute("maVariable").getDuree() request.getAttribute("maVariable").getDuree() request.getSession().getAttribute("maVariable").getDuree() pageContext.getServletContext().getAttribute("maVariable").getDuree() (Le premier getAttribute() qui lui aura retourné une valeur) S’emploie sur une page JSP ainsi: Débuté plus tôt. Débuté ${maVariable.duree} plus tôt
Marc Le BihanStruts 1.x13 Un fichier WEB-INF/web.xml basique. Authentification /authentification/login.jsp Authentification /Login Login Déclaration servlets et jsp: web.xml
Marc Le BihanStruts 1.x14 Prise en charge de Struts
Marc Le BihanStruts 1.x15 Déclaration de Struts (1/3): binaires Une distribution de Struts est placée dans WEB-INF/lib avec quelques compléments commons de Tomcat.
Marc Le BihanStruts 1.x16 Reprend les mots-clés HTML, en facilitant parfois leur écriture. Agir directement sur Struts et manipuler des messages. Tests et conditions. Mise en page. Déclaration de Struts (2/3): JSP
Marc Le BihanStruts 1.x17 action org.apache.struts.action.ActionServlet config /WEB-INF/ struts-config.xml 1 action *.do Déclaration de Struts (3/3): web.xml
Marc Le BihanStruts 1.x18 Toutes les données utiles d’une page jsp qui seront affichées, contrôlées ou transportées à une autre page sont rassemblées dans un formulaire. Il représente le contenu d’une page JSP. C’est un Bean: il a un constructeur public sans arguments, des getters et des setters. class MonForm extends ActionForm { private String m_szNom; private int m_nAge; public String getNom() {...} public int getAge() {...} public void setNom(String szNom) {...} public void setAge(int nAge) {...} } Principe de fonctionnement (1/4)
Marc Le BihanStruts 1.x19 Dans la page JSP, ce formulaire sera déclaré par: <jsp:useBean id="f" class="MonForm" scope="page|request|session|application"> pour que le code présent dans la page HTML puisse accéder à son contenu. Bonjour ${f.nom} Principe de fonctionnement (2/4)
Marc Le BihanStruts 1.x20 Dans struts-config.xml, ce formulaire est aussi déclaré. Cette relation permettra à Struts de provoquer le chargement des valeurs dans le formulaire à l'arrivée dans la page, (page|request|session|attribute).getAttribute("f").getXXX() dans les contrôles portés par la page JSP. Principe de fonctionnement (3/4)
Marc Le BihanStruts 1.x21 Principe de fonctionnement (4/4) ainsi, les champs seront alimentés à partir du formulaire f. contiendra la valeur de f.getNom() résolu en String Présentera l'entrée qui correspond à la valeur de f.getAge(), qui renvoie un int. Réciproquement, lors de la soumission d'une page JSP, les valeurs des contrôles seront replacées par f.setXXX() dans le formulaire, et lui replacé en page, requête, session ou application.
Marc Le BihanStruts 1.x22 Une première validation de contenu peut être réalisée en implémentant une méthode dans le formulaire. public ActionErrors validate(ActionMapping mappings, httpServletRequest req) { ActionErrors errors = new ActionErrors(); if (m_nAge == 1) errors.add("age", new ActionError("jouetInapproprie")); return(errors); } Première validation de contenu (1/3)
Marc Le BihanStruts 1.x23 La mention jouetInapproprie fait référence à une entrée dans un fichier de propriétés où se trouve le message que l'on veut afficher. Ce fichier est mentionné dans le struts-config.xml Et dans jouets.properties jouetInapproprie=Ce jouet ne convient pas pour cet âge. Première validation de contenu (2/3)
Marc Le BihanStruts 1.x24 Enfin, dans la page JSP on précise l'emplacement où l'on souhaite que le message d'erreur soit affiché par cette instruction: Les messages d'erreurs créés par new ActionError() peuvent prendre des arguments. jouetInapproprie=Ce jouet ne convient pas pour les {0}. errors.add(new ActionMessage("jouetInapproprie", "moins de dix ans")); S'il n'y a aucune erreur détectée, renvoyer une collection ActionsErrors() vide par la méthode validate, et alors le formulaire sera validé. Première validation de contenu (3/3)
Marc Le BihanStruts 1.x25 Le formulaire validé est soumis à un contrôleur. public MonAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { … } Ce contrôleur peut réaliser d'autres validations et décider de mener la navigation Internet à une nouvelle page (forward). Soumission au contrôleur (1/3)
Marc Le BihanStruts 1.x26 Soumission au contrôleur (2/3) Ce contrôleur a été déclaré à Struts toujours par le biais du fichier struts- config.xml Des destinations communes à tous peuvent aussi être déclarées dans ce fichier.
Marc Le BihanStruts 1.x27 Soumission au contrôleur (3/3) Dans la fonction de traitement du contrôleur on réalise donc d'autres validations, et l'on redirige le navigateur. public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { MonForm f = (MonForm)form; ActionsErrors errors = new ActionsErrors(); // Quelques contrôles supplémentaires if (f.getNom().length() <= 1) errors.add(new ActionError("nom", "nomTropCourt")); if (!errors.empty()) { saveErrors(request, errors); // Il faut mettre errors dans son contexte. return(null); // Signifie: nous resterons sur la page où nous sommes. } return(mapping.findForward("adresse")); // Nouvelle destination. }