Sunteți pe pagina 1din 38

INSA - ASI

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)

Le MVC sans Struts

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)

Contenu (partiel) de struts-blank

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)

Fonctionnement dune application Struts

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

Une JSP est appele en fonction du rsultat de la mthode et du struts.xml

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

Donnes en provenance dun formulaire / dun lien


Fonctionnement

(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

Donnes en provenance dun formulaire / dun lien


Exemple : HelloWorldPost

(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

Donnes en provenance dun formulaire / dun lien


Exemple : HelloWorldPost

(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

Donnes en provenance dun formulaire / dun lien


Exemple : HelloWorldPost

(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

Donnes en provenance dun formulaire / dun lien


Exemple : HelloWorldPost

(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

Donnes en provenance dun formulaire / dun lien


Exemple : HelloWorldPost

(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

Couverture dun formulaire par un Javabean


Principe

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Couverture dun formulaire par un Javabean


Exemple : Javabean

(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

Validation dun formulaire


Principe

(1/6)

Validation de formulaire en utilisant Struts 2


Utiliser les rsultats de la mthode de traitement dun formulaire pour choisir la vue :
Le contrle est dni dans struts.xml Les tests sont eectus dans le contrleur

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

Validation dun formulaire


Exemple : Validation

(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

Validation dun formulaire


Exemple : Validation

(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

Validation dun formulaire


Exemple : Validation

(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

Validation dun formulaire


Exemple : Validation

(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

Validation dun formulaire


Exemple : Validation

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

Faut-il utiliser Struts ?

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)

http://struts.apache.org/ http://www-lih.univ-lehavre.fr/~coletta/dess0607/struts/une_appli.html http://www-lih.univ-lehavre.fr/~coletta/dess0607/struts/erreurs.html http://www.labo-sun.com/resource-fr-essentiels-859-5-java-j2ee-struts-un-framework-mvc-pour-vosapplications-j2ee.htm\#h1n3 http://www.jmdoudoux.fr/java/dej/chap052.htm

S-ar putea să vă placă și