Documente Academic
Documente Profesional
Documente Cultură
TechnoWeb : Struts
1/38
Technologie Web
Un framework J2EE : Struts Alexandre Pauchet
INSA Rouen - Dpartement ASI
BO.B.RC.18, pauchet@insa-rouen.fr
INSA - ASI
TechnoWeb : Struts
2/38
Plan
Introduction Fonctionnement Donnes en provenance dun formulaire / dun lien Couverture dun formulaire par un Javabean Validation dun formulaire Conclusion
INSA - ASI
TechnoWeb : Struts
3/38
Introduction
Description
(1/6)
Framework dvelopp par Apache (comme Tomcat) Bas sur J2EE (JSP et servlets) :
Surcouche J2EE, Toute application Struts est une application web J2EE
Ajoute de nouvelles classes Ajoute de nouveaux tags pour JSP Bas sur larchitecture MVC (Modle-Vue-Contrleur) Trs utilis
INSA - ASI
TechnoWeb : Struts
4/38
Introduction
Le MVC (rappel)
(2/6)
Le Modle-Vue-Contrleur (MVC) est une architecture et une mthode de conception pour le dveloppement dapplications logicielles. Le MVC distingue : Modle (donnes) : le comportement de lapplication. Vue (prsentation) : interface avec lutilisateur. Contrleur (traitement) : gestion des vnements de synchronisation entre la vue et le modle. En rsum, lorsquun client envoie une requte lapplication, celle-ci est analyse par le contrleur, qui demande au modle appropri deectuer les traitements, puis renvoie la vue adapte au navigateur.
INSA - ASI
TechnoWeb : Struts
5/38
Introduction
(3/6)
Des javabeans (et autres classes) qui grent laspect mtier (modle) Des JSP (ventuellement sans code Java) qui produisent lachage (les vues) Une ou plusieurs Servlets font le lien entre les JavaBeans et les JSP, via les mcanismes de Dlgation/Inclusion (contrleur(s))
INSA - ASI
TechnoWeb : Struts
6/38
Fonctionnement
Lide de Struts
(4/6)
Ajouter un chier de conguration en XML dnissant les actions gres par le contrleur (struts.xml) Fichier gr par une Servlet spcique, dnie dans le web.xml :
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter -class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Avantages
Le code Java se limite dsormais aux aspects mtiers Beaucoup plus de souplesse : pour changer le comportement de lapplication, il sut de changer le code XML Moins de compilation
INSA - ASI
TechnoWeb : Struts
7/38
Introduction
Installation
(5/6)
Installation
1
Rcuprer une archive struts2-blank.war (comprise dans les exemples dapplication) sur http://struts.apache.org/. Versions : 2.2.1 et 2.2.3.1 La copier dans webapps : elle se dcompresse toute seule, comme tout chier .war On a alors une application Struts vide
Pour crer une nouvelle application, on rcupre une archive struts2-examples.googlecode.com/files/Basic_Struts_2_Ant_2_ 2_1.zip, on la dcompresse et renomme, et on eectue les modications lintrieur.
INSA - ASI
TechnoWeb : Struts
8/38
Introduction
(6/6)
struts-blank.war |_ index.html |_ error.jsp |_ example | |_ Welcome.jsp, ... |_ WEB_INF | |_ web.xml | |_ src | | |_ java | | |_ ... | |_ lib | | |_ struts2-core-2.2.1.jar, ... | |_ classes | |_ struts.xml, ... |_ META-INF |_ MANIFEST.MF, ...
INSA - ASI
TechnoWeb : Struts
9/38
Fonctionnement
(1/6)
Lutilisateur appelle une URL de la forme traitement.action (formulaire, lien, etc.), traite selon le contenu de struts.xml On appelle la mthode execute dune instance drive de la classe ActionSupport :
public String execute() throws Exception { ... }
INSA - ASI
TechnoWeb : Struts
10/38
Fonctionnement
Exemple : HelloWorld
(2/6)
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> < title >Basic Struts 2 Application - Welcome</title> </head> <body> <h1>Welcome To Struts 2!</h1> <p><a href="<s:url action=hello/>">Hello World</a></p> </body> </html>
INSA - ASI
TechnoWeb : Struts
11/38
Fonctionnement
Exemple : HelloWorld
(3/6)
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="basicstruts2" extends="struts-default"> <!-- If no class attribute is specified the framework will assume success and render the result index .jsp --> <!-- If no name value for the result node is specified the success value is the default --> <action name="index"> <result>/index.jsp</result> </action> <!-- If the URL is hello.action the call the execute method of class HelloWorldAction. If the result returned by the execute method is success render the HelloWorld.jsp --> <action name="hello" class="helloworld.action.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
INSA - ASI
TechnoWeb : Struts
12/38
Fonctionnement
Exemple : HelloWorld
(4/6)
HelloWordAction.java
package helloworld.action; import helloworld.model.StringMessage; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { private static nal long serialVersionUID = 1L; private StringMessage message; public String execute() throws Exception { this .message = new StringMessage("Hello World !") ; return SUCCESS; } public StringMessage getStringMessage() { return this.message; } public void setStringMessage(StringMessage message) { this .message = message; } }
INSA - ASI
TechnoWeb : Struts
13/38
Fonctionnement
Exemple : HelloWorld
(5/6)
StringMessage.java
package helloworld.model; public class StringMessage { private String mes; public StringMessage(String message) { this .setMessage(message); } public String getMessage() { return this.mes; } public void setMessage(String message) { this .mes = message; } }
INSA - ASI
TechnoWeb : Struts
14/38
Fonctionnement
Exemple : HelloWorld
(6/6)
HelloWorld.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> < title >Hello World!</title> </head> <body> <h2><s:property value="stringMessage.message" /></h2> </body> </html>
INSA - ASI
TechnoWeb : Struts
15/38
(1/6)
Utilisation de javabeans
Lutilisateur remplit (par exemple) un formulaire issu dune JSP ou dun document HTML statique On appelle lors de la validation une URL de la forme traitement.action, qui est traite en fonction du contenu de struts.xml On appelle la mthode execute dune instance drive de la classe ActionSupport La classe appele doit se prsenter sous la forme dun javabean dont les proprits (getter et setter) vont correspondre aux champs du formulaire Une JSP est appele en fonction du rsultat de la mthode et du struts.xml
INSA - ASI
TechnoWeb : Struts
16/38
(2/6)
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd "> <%@taglib uri="/struts-tags" prefix="s" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> < title >Hello World Post</title> </head> <body> <s:url action="hello" var="helloLink"> <s:param name="userName">Bob Leponge</s:param> </s:url> <p><a href="${helloLink}">Hello Bob Leponge</a></p> <s:form action="hello" > <s:textfield name="userName" label="User Name" /> <s:submit /> </s:form> </body> </html>
INSA - ASI
TechnoWeb : Struts
17/38
(3/6)
struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http:// struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="hello" class="helloworldpost.action.HelloWorldPostAction" method="execute"> <result name="success">/success.jsp</result> </action> </package> </struts>
INSA - ASI
TechnoWeb : Struts
18/38
(4/6)
HelloWordPostAction.java
package helloworldpost.action; import helloworldpost.model.UserName; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldPostAction extends ActionSupport { private static nal long serialVersionUID = 1L; private UserName userName; private String message; public String execute() throws Exception { this .message = "Hello " + this.getUserName() + " !"; return SUCCESS; } public String getMessage() { return this.message; } public String getUserName() { return this.userName.getName(); } public void setUserName(String userName) { this .userName = new UserName(userName); } }
INSA - ASI
TechnoWeb : Struts
19/38
(5/6)
UserName.java
package helloworldpost.model; public class UserName { private String name; public UserName(String name) { this .setName(name); } public String getName() { return this.name; } public void setName(String name) { this .name = name; } }
INSA - ASI
TechnoWeb : Struts
20/38
(6/6)
success.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd "> <%@taglib uri="/struts-tags" prefix="s" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> < title >Hello World</title> </head> <body> <h1><s:property value="message" /></h1> </body> </html>
INSA - ASI
TechnoWeb : Struts
21/38
(1/9)
Principe
Les proprits dun Javabean sont utilises pour encapsuler les valeurs dun formulaire Des tags Struts 2 sont utiliss pour lier champs et proprits Les tags Struts 2 sont interprts pour gnrer du code HTML Dans struts.xml, une mthode doit tre dnie pour forcer le ltre et parser les tags Certains tags (listes, radio buttons, etc.) ncessitent une initialisation
INSA - ASI
TechnoWeb : Struts
22/38
(2/9)
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> < title >Struts 2 Form Tags - Welcome</title> </head> <body> <h1>Welcome To Struts 2!</h1> <p><a href=<s:url action="edit" /> >Edit your information</a></p> </body> </html>
INSA - ASI
TechnoWeb : Struts
23/38
(3/9)
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http:// struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="basicstruts2" extends="struts-default"> <!-- If no class attribute is specified the framework will assume success and render the result index .jsp --> <!-- If no name value for the result node is specified the success value is the default --> <action name="index"> <result>/index.jsp</result> </action> <action name="edit" class="register.action.Register" method="input"> <result name="input">/edit.jsp</result> </action> <action name="register" class="register.action.Register" method="execute"> <result name="success">/thankyou.jsp</result> </action> </package> </struts>
INSA - ASI
TechnoWeb : Struts
24/38
(4/9)
edit.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> < title >Basic Struts 2 Application - Welcome</title> </head> <body> <h1>Welcome To Struts 2!</h1> <p>Fill out and submit the following form:</p> <s:form action="register"> <s:textfield name="personBean.firstName" label="First name" /> <s:textfield name="personBean.lastName" label="Last name" /> <s:textfield name="personBean.email" label ="Email"/> <s:radio key="personBean.gender" label ="Gender" list="genders" /> <s:select key="personBean.sport" label ="Sport" list="sports" /> <s:checkbox key="personBean.over21" label="Over 21" /> <s:submit value="Submit" /> </s:form> </body> </html>
INSA - ASI
TechnoWeb : Struts
25/38
(5/9)
Register.java
package register.action; import import import import import java.util.ArrayList; java.util.Arrays; java.util.List; register.model.Person; com.opensymphony.xwork2.ActionSupport;
public class Register extends ActionSupport { private static nal long serialVersionUID = 1L; private Person personBean; private String [] sports = {"football", "volleyball", "basketball"}; private String [] genders = {"male", "female"}; public String execute() throws Exception { return SUCCESS; } public String input() throws Exception { return INPUT; } public Person getPersonBean() { return personBean; }
...
INSA - ASI
TechnoWeb : Struts
26/38
(6/9)
Register.java
...
} public List<String> getSports() { return Arrays.asList(sports); } public List<String> getGenders() { return Arrays.asList(genders); } } public void setPersonBean(Person person) { personBean = person;
INSA - ASI
TechnoWeb : Struts
27/38
(7/9)
Person.java
package register.model; public class Person { private String firstName; private String lastName; private String email; private String gender; private boolean over21; private String sport; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }
...
INSA - ASI
TechnoWeb : Struts
28/38
(8/9)
Person.java
...
public void setGender(String gender) { this.gender = gender; } public String getGender() { return gender; } public void setOver21(boolean over21) { this.over21 = over21; } public boolean isOver21() { return over21; } public String getSport() { return sport; } public void setSport(String sport) { this.sport = sport; } public String toString() { String desc = getFirstName() + " " + getLastName() + ", " + getEmail() + ", " + getGender() + ", joueur de " + getSport(); if (over21) desc += ", majeur"; else desc += ", mineur"; return desc; } }
INSA - ASI
TechnoWeb : Struts
29/38
(9/9)
thankyou.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> < title >Registration Successful</title> </head> <body> <h3>Thank you for registering !</h3> <p>Your registration information: <s:property value="personBean" /> </p> <p><a href="<s:url action=edit />" >Return to home page</a>.</p> </body> </html>
INSA - ASI
TechnoWeb : Struts
30/38
(1/6)
Faciliter les messages derreurs en utilisant les tags Struts 2 Attention : la validation ct serveur ncessite galement une validation ct utilisateur
INSA - ASI
TechnoWeb : Struts
31/38
(2/6)
index.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> < title >Register</title> <s:head /><!-- Ncessaire pour afficher les erreurs !--> </head> <body> <h3>Please register</h3> <s:form action="register"> <s:textfield name="personBean.firstName" label="First name" /> <s:textfield name="personBean.lastName" label="Last name" /> <s:textfield name="personBean.email" label ="Email"/> <s:textfield name="personBean.age" label="Age" /> <s:submit/> </s:form> </body> </html>
INSA - ASI
TechnoWeb : Struts
32/38
(3/6)
Person.java
package register.model; public class Person { private String firstName; private String lastName; private String email; private int age; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return getFirstName() + " " + getLastName() + ", " + getEmail() + ", " + getAge() + " ans"; } }
INSA - ASI
TechnoWeb : Struts
33/38
(4/6)
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http:// struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="basicstruts2" extends="struts-default"> <!-- If no class attribute is specified the framework will assume success and render the result index .jsp --> <!-- If no name value for the result node is specified the success value is the default --> <action name="index"> <result>/index.jsp</result> </action> <action name="register" class="register.action.Register" method="execute"> <result name="success">/thankyou.jsp</result> <result name="input">/index.jsp</result> </action> </package> </struts>
INSA - ASI
TechnoWeb : Struts
34/38
(5/6)
Register.java
package register.action; import register.model.Person; import com.opensymphony.xwork2.ActionSupport; public class Register extends ActionSupport { private static nal long serialVersionUID = 1L; private Person personBean; public String execute() throws Exception { return SUCCESS; } public void validate(){ if ( personBean.getFirstName().length() == 0 ){ addFieldError( "personBean.firstName", "First name is required." ); } if ( personBean.getEmail().length() == 0 ){ addFieldError( "personBean.email", "Email is required." ); } if ( personBean.getAge() < 18 ){ addFieldError( "personBean.age", "Age is required and must be 18 or older" ); } } public Person getPersonBean() { return this.personBean; } public void setPersonBean(Person person) { this.personBean = person; } }
INSA - ASI
TechnoWeb : Struts
35/38
(6/6)
thankyou.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> < title >Registration Successful</title> </head> <body> <p>Registration information: <s:property value="personBean" /> </p> <p><a href="<s:url action=index />" >Return to home page</a>.</p> </body> </html>
INSA - ASI
TechnoWeb : Struts
36/38
Conclusion
(1/3)
Struts ? Et le reste ?
Struts nest pas le seul outil de haut niveau disponible pour les applications web J2EE : Java Server Faces (JSF), Tapestry, Hibernate, Spring (Spring MVC), ... Ces outils ne sont pas mutuellement exclusifs : Struts est plutt spcialis "contrleur" JSF propose des composants graphiques : "vue" Hibernate, les EJB et autres sintressent la srialisation des objets : "modle"
INSA - ASI
TechnoWeb : Struts
37/38
Conclusion
(2/3)
Oui si lapplication est consquente ; Non sil sagit dune application simple (exemple limite, le blog) : mme le site de Struts dconseille dutiliser le Framework dans ces cas-l On peut utiliser des JSP seules, du PHP ou un framework dit agile (Ruby on Rails, Django, ...) dans les cas plus simples
INSA - ASI
TechnoWeb : Struts
38/38
Conclusion
Sources
(3/3)