marc le bihanstruts 1.x1 marc le bihan. struts 1.x2 plan i)développement web par servlets et jsp....

27
Marc Le Bihan Struts 1.x 1 Struts 1.x Marc Le Bihan

Upload: eloy-hamel

Post on 04-Apr-2015

105 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 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

Marc Le Bihan Struts 1.x 1

Struts 1.x

Marc Le Bihan

Page 2: 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

Marc Le Bihan Struts 1.x 2

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.

Page 3: 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

Marc Le Bihan Struts 1.x 3

Construction de pages web par servlets et JSP

Page 4: 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

Marc Le Bihan Struts 1.x 4

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("<HTML>Bonjour %s</HTML>", szNom); out.close(); }}

web simpliste: la servlet (1/3)

Page 5: 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

Marc Le Bihan Struts 1.x 5

Mais:- Elle mélange le code de présentation (HTML)

à celui de contrôle et/ou d’action.

- L’émission d’HTML est assez disgracieuxout.println("…");

- La transition d’une servlet à une autre se fait par un objet RequestDispatcher assez lourd à manipuler.

web simpliste: la servlet (2/3)

Page 6: 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

Marc Le Bihan Struts 1.x 6

- 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)

Page 7: 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

Marc Le Bihan Struts 1.x 7

Les JSP offrent un moyen de détacher la partie présentation de la partie validation/action.

<%@page language="java" %>

<%@page import="java.io.*" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%! private void indicateur(JspWriter out, boolean bIndicateur) throws IOException {...} %>

<% indicateur(out, ve.isOuvert()); %>

<body> <c:choose> <c:when test="<%=x.estValide() %>"> <div>Bienvenue</div> </c:when> <c:otherwise>Ca ne va pas</c:otherwise> </c:choose></body>

Web évolué: les JSP (1/2)

Page 8: 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

Marc Le Bihan Struts 1.x 8

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.

Page 9: 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

Marc Le Bihan Struts 1.x 9

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é

Page 10: 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

Marc Le Bihan Struts 1.x 10

<jsp:useBean>Les variables et leur portée (1/2)

Dans une page jsp, six types de variables peuvent intervenir.La variable locale: <% String szNom; %>La variable membre de servlet: <%! int m_nCompteur; %>

<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");

Page 11: 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

Marc Le Bihan Struts 1.x 11

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 <jsp:useBean> ou leurs instructions java équivalentes sont accessibles par

<jsp:getProperty …> et <jsp:setProperty …>, ainsi que par la désignation ${maVariable} dans une page JSP.

Les deux autres ne le sont que par <%= maVariable %>

<jsp:useBean>Les variables et leur portée (2/2)

Page 12: 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

Marc Le Bihan Struts 1.x 12

<jsp:getProperty name="maVariable"

property="duree">

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").getDu

ree()(Le premier getAttribute() qui lui aura retourné une valeur)

S’emploie sur une page JSP ainsi:<p>Débuté <jsp:getProperty name="maVariable" property="duree"> plus

tôt.</p><p>Débuté ${maVariable.duree} plus tôt</p>

<jsp:getProperty>

Page 13: 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

Marc Le Bihan Struts 1.x 13

Un fichier WEB-INF/web.xml basique.

<web-app> <!-- Une servlet (qui est ici une jsp) --> <servlet> <servlet-name>Authentification</servlet-name> <jsp-file>/authentification/login.jsp</jsp-file> </servlet>

<!-- est lancée par /Login sur le navigateur. --> <servlet-mapping> <servlet-name>Authentification</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping>

<welcome-file-list> <welcome-file>Login</welcome-file> </welcome-file-list></web-app>

Déclaration servlets et jsp: web.xml

Page 14: 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

Marc Le Bihan Struts 1.x 14

Prise en charge de Struts

Page 15: 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

Marc Le Bihan Struts 1.x 15

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.

Page 16: 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

Marc Le Bihan Struts 1.x 16

<%@taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>Reprend les mots-clés HTML, en facilitant parfois leur

écriture.

<%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>Agir directement sur Struts et manipuler des messages.

<%@taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>Tests et conditions.

<%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>Mise en page.

Déclaration de Struts (2/3): JSP

Page 17: 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

Marc Le Bihan Struts 1.x 17

<web-app> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param>

<load-on-startup>1</load-on-startup> </servlet>

<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping></web-app>

Déclaration de Struts (3/3): web.xml

Page 18: 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

Marc Le Bihan Struts 1.x 18

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)

Page 19: 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

Marc Le Bihan Struts 1.x 19

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.

<p>Bonjour ${f.nom}</p>

Principe de fonctionnement (2/4)

Page 20: 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

Marc Le Bihan Struts 1.x 20

Dans struts-config.xml, ce formulaire est aussi déclaré.

<struts-config> <form-bean name="f" type="MonForm"> </struts-config>

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)

Page 21: 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

Marc Le Bihan Struts 1.x 21

Principe de fonctionnement (4/4)ainsi, les champs seront alimentés à partir du formulaire f.

<input name="nom" type="text" />contiendra la valeur de f.getNom() résolu en String.

<select name="age"> <option value="1">0-10</option> <option value="2">11-20</option> <option value="3">20+</option></select>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.

Page 22: 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

Marc Le Bihan Struts 1.x 22

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)

Page 23: 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

Marc Le Bihan Struts 1.x 23

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<struts-config> <message-ressources

parameter="properties.jsp.jouets" null="false" key="jouets">

</struts-config>

Et dans jouets.propertiesjouetInapproprie=Ce jouet ne convient pas pour cet âge.

Première validation de contenu (2/3)

Page 24: 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

Marc Le Bihan Struts 1.x 24

Enfin, dans la page JSP on précise l'emplacement où l'on souhaite que le message d'erreur soit affiché par cette instruction:

<html:messages id="errors" message="true" bundle="jouets"> <bean:write name="errors" /><br/></html:messages>

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)

Page 25: 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

Marc Le Bihan Struts 1.x 25

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)

Page 26: 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

Marc Le Bihan Struts 1.x 26

Soumission au contrôleur (2/3)

Ce contrôleur a été déclaré à Struts toujours par le biais du fichier struts-config.xml

<struts-config> <action type="MonAction" name="f" path="/cadeaux"> <forward name="adresse" path="/monAdresse.jsp" /> <forward name="papier" path="/monPapierCadeau.jsp" /> </action></struts-config>

Des destinations communes à tous peuvent aussi être déclarées dans ce fichier.<global-forwards> <forward name="CDV" path="/conditionsDeVente.jsp" /> <forward name="contact" path="/ContactezNous.jsp" /></global-forwards>

Page 27: 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

Marc Le Bihan Struts 1.x 27

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.}