Title: Plan
1 2Plan
- Développement web par Servlets et JSP.
- Prise en charge de Struts.
- Principe de fonctionnement du formulaire.
- La soumission au contrôleur.
3- Construction de pages web par servlets et JSP
4web simpliste la servlet (1/3)
- 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("ltHTMLgtBonjour slt/HTMLgt",
szNom) - out.close()
-
-
5web simpliste la servlet (2/3)
- Mais
- Elle mélange le code de présentation (HTML) à
celui de contrôle et/ou daction. - Lémission dHTML est assez disgracieuxout.printl
n("") - La transition dune servlet à une autre se fait
par un objet RequestDispatcher assez lourd à
manipuler.
6web simpliste la servlet (3/3)
- Les champs de saisie ne sont que ceux accessibles
en HTML, et ils ne peuvent pas sauto-contrôler. - La création dune page complexe (avec panneaux
dentête, pied, corps, etc.) est laborieuse. - Le javascript est rude à intégrer.
7Web évolué les JSP (1/2)
- Les JSP offrent un moyen de détacher la partie
présentation de la partie validation/action. - lt_at_page language"java" gt
- lt_at_page import"java.io." gt
- lt_at_taglib uri"http//java.sun.com/jsp/jstl/core"
prefix"c" gt - lt! private void indicateur(JspWriter out,
boolean bIndicateur) throws IOException ... gt - lt indicateur(out, ve.isOuvert()) gt
- ltbodygt
- ltcchoosegt
- ltcwhen test"ltx.estValide() gt"gt
- ltdivgtBienvenuelt/divgt
- lt/cwhengt
- ltcotherwisegtCa ne va paslt/cotherwisegt
- lt/cchoosegt
- lt/bodygt
8Web évolué les JSP (2/2)
- Mais
- Les transitions entre pages restent délicates.
- Malgré la présence de tags (dont JSTL), les
scriplets Java (lt gt) restent nombreux et
embarrassants. - Mise en page.
- Capacité de validation. Les champs restent de ce
que lHTML propose.
9Un framework proposé
- 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 lon en respecte les
règles, se propose de - Nommer les pages par des étiquettes que lon
désignera pour les atteindre. - Transmettre les données entre pages dune manière
bien délimitée. - Proposer des aides à la validation et à la mise
en page.
10ltjspuseBeangtLes variables et leur portée (1/2)
Dans une page jsp, six types de variables peuvent
intervenir.La variable locale lt String szNom
gtLa variable membre de servlet lt! int
m_nCompteur gtltjspuseBean id"maVariable"
scope"" class"p1.p2.MaClasse"gt
type"p1.p2.MaClasse"La
variable de portée page, scope page,gt
pageContext.getAttribute("maVariable") La
variable de portée requête, scope request, gt
request.getAttribute("maVariable")
11ltjspuseBeangtLes variables et leur portée (2/2)
- La variable de portée session, scope session
- gt request.getSession().getAttribute("maVariable")
- La variable de portée application, scope
application - gt pageContext.getServletContext().getAttribute("m
aVariable") - Seules les variables définies par ltjspuseBeangt
ou leurs instructions java équivalentes sont
accessibles par - ltjspgetProperty gt et ltjspsetProperty gt, ainsi
que par la désignation maVariable dans une
page JSP. - Les deux autres ne le sont que par lt maVariable
gt
12ltjspgetPropertygt
- ltjspgetProperty name"maVariable"
property"duree"gt - Affiche sur la page HTML le contenu de
- pageContext.getAttribute("maVariable").getDuree()
- request.getAttribute("maVariable").getDuree()
- request.getSession().getAttribute("maVariable").ge
tDuree() - pageContext.getServletContext().getAttribute("maVa
riable").getDuree() - (Le premier getAttribute() qui lui aura retourné
une valeur) - Semploie sur une page JSP ainsi
- ltpgtDébuté ltjspgetProperty name"maVariable"
property"duree"gt plus tôt.lt/pgt - ltpgtDébuté maVariable.duree plus tôtlt/pgt
13Déclaration servlets et jsp web.xml
- Un fichier WEB-INF/web.xml basique.
- ltweb-appgt
- lt!-- Une servlet (qui est ici une jsp) --gt
- ltservletgt
- ltservlet-namegtAuthentificationlt/servlet-name
gt - ltjsp-filegt/authentification/login.jsplt/jsp-f
ilegt - lt/servletgt
- lt!-- est lancée par /Login sur le navigateur.
--gt - ltservlet-mappinggt
- ltservlet-namegtAuthentificationlt/servlet-name
gt - lturl-patterngt/Loginlt/url-patterngt
- lt/servlet-mappinggt
- ltwelcome-file-listgt
- ltwelcome-filegtLoginlt/welcome-filegt
- lt/welcome-file-listgt
- lt/web-appgt
14- Prise en charge de Struts
15Déclaration de Struts (1/3) binaires
- Une distribution de Struts est placée dans
WEB-INF/lib avec quelques compléments commons de
Tomcat.
16Déclaration de Struts (2/3) JSP
- lt_at_taglib uri"/WEB-INF/struts-html.tld"
prefix"html" gt - Reprend les mots-clés HTML, en facilitant parfois
leur écriture. - lt_at_taglib uri"/WEB-INF/struts-bean.tld"
prefix"bean" gt - Agir directement sur Struts et manipuler des
messages. - lt_at_taglib uri"/WEB-INF/struts-logic.tld"
prefix"logic" gt - Tests et conditions.
- lt_at_taglib uri"/WEB-INF/struts-tiles.tld"
prefix"tiles" gt - Mise en page.
17Déclaration de Struts (3/3) web.xml
- ltweb-appgt
- ltservletgt
- ltservlet-namegtactionlt/servlet-namegt
- ltservlet-classgtorg.apache.struts.action.Acti
onServletlt/servlet-classgt - ltinit-paramgt
- ltparam-namegtconfiglt/param-namegt
- ltparam-valuegt/WEB-INF/struts-config.xmllt/
param-valuegt - lt/init-paramgt
- ltload-on-startupgt1lt/load-on-startupgt
- lt/servletgt
- ltservlet-mappinggt
- ltservlet-namegtactionlt/servlet-namegt
- lturl-patterngt.dolt/url-patterngt
- lt/servlet-mappinggt
- lt/web-appgt
18Principe de fonctionnement (1/4)
- Toutes les données utiles dune 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 dune page JSP.
- Cest 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) ...
19Principe de fonctionnement (2/4)
- Dans la page JSP, ce formulaire sera déclaré par
- ltjspuseBean id"f" class"MonForm"
- scope"pagerequestsessionapplication"gt
- pour que le code présent dans la page HTML puisse
- accéder à son contenu.
- ltpgtBonjour f.nomlt/pgt
20Principe de fonctionnement (3/4)
- Dans struts-config.xml, ce formulaire est aussi
déclaré. - ltstruts-configgt
- ltform-bean name"f" type"MonForm"gt
- lt/struts-configgt
- Cette relation permettra à Struts de provoquer le
chargement des valeurs dans le formulaire à
l'arrivée dans la page, - (pagerequestsessionattribute).getAttribute("f")
.getXXX() - dans les contrôles portés par la page JSP.
21Principe de fonctionnement (4/4)
- ainsi, les champs seront alimentés à partir du
formulaire f. - ltinput name"nom" type"text" /gt
- contiendra la valeur de f.getNom() résolu en
String. - ltselect name"age"gt
- ltoption value"1"gt0-10lt/optiongt
- ltoption value"2"gt11-20lt/optiongt
- ltoption value"3"gt20lt/optiongt
- lt/selectgt
- 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.
22Première validation de contenu (1/3)
- 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("jouetIna
pproprie")) - return(errors)
23Première validation de contenu (2/3)
- 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 - ltstruts-configgt
- ltmessage-ressources parameter"properties.jsp.j
ouets" null"false" key"jouets"gt - lt/struts-configgt
- Et dans jouets.properties
- jouetInapproprieCe jouet ne convient pas pour
cet âge.
24Première validation de contenu (3/3)
- Enfin, dans la page JSP on précise l'emplacement
où l'on souhaite que le message d'erreur soit
affiché par cette instruction - lthtmlmessages id"errors" message"true"
bundle"jouets"gt - ltbeanwrite name"errors" /gtltbr/gt
- lt/htmlmessagesgt
- Les messages d'erreurs créés par new
ActionError() peuvent prendre des arguments. - jouetInapproprieCe 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é.
25Soumission au contrôleur (1/3)
- 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).
26Soumission au contrôleur (2/3)
Ce contrôleur a été déclaré à Struts toujours par
le biais du fichier struts-config.xml ltstruts-con
figgt ltaction type"MonAction" name"f"
path"/cadeaux"gt ltforward name"adresse"
path"/monAdresse.jsp" /gt ltforward
name"papier" path"/monPapierCadeau.jsp" /gt
lt/actiongt lt/struts-configgt Des destinations
communes à tous peuvent aussi être déclarées dans
ce fichier. ltglobal-forwardsgt ltforward
name"CDV" path"/conditionsDeVente.jsp" /gt
ltforward name"contact" path"/ContactezNous.jsp"
/gt lt/global-forwardsgt
27Soumission 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() lt 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("a
dresse")) // Nouvelle destination.