org/int/asso/asf/server/web/Struts.html
<!--#include virtual="/header-start.html" -->
<title>Struts</title>
<meta name="url" content="https://struts.apache.org">
<!--#include virtual="/header-end.html" -->
<section>
<h2>Besoin</h2>
<p>Fournir un <a href="/tech/info/soft/Framework.html">framework</a> <a
href="/tech/info/soft/proj/design/arch/web/index.html">Web</a> <a
href="/org/us/company/oracle/sun/ptf/java/api/ee">Java</a> <a href="/tech/info/soft/prod/licence/oss">Open
Source</a> prenant en charge :</p>
<ul>
<li>la séparation des <a href="/tech/info/soft/IHM.html">IHM</a> et des processus métiers</li>
<li>le contrôle de saisie des formulaires</li>
<li>diverses optimisations (<a href="/tech/info/soft/Pooling.html"><em>pooling</em></a>)</li>
</ul>
</section>
<section>
<h2>Analyse</h2>
<p>Struts externalise les interactions entre requête et actions ainsi que le contrôle de validité des
formulaires. </p>
</section>
<section>
<h2>Conception</h2>
<p>Struts applique le <a href="/tech/info/soft/proj/design/pattern/index.html">DP</a> <a
href="/tech/info/soft/proj/design/pattern/MVC.html">MVC</a> qui répartit les responsabilités entre :</p>
<ul>
<li><b>(M)odèle </b>: les <i>form beans</i> représentant les données saisies dans des formulaires. D'un point de vue
global, les <i>form beans </i>ne représentent qu'un <em>modèle de présentation</em>, c'est-à-dire un moyen de
récolter les informations saisies par l'utilisateur, mais qui ne correspond pas forcément au véritable modèle,
généralement situé dans des JavaBeans ou des <a href="/org/us/company/oracle/sun/ptf/java/api/ee/EJB.html">EJB</a>
métier annexes.</li>
<li><b>(V)ue </b>: les <a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSP.html">JSP</a>, utilisant des balises
Struts.</li>
<li><b>(C)ontrôleur</b> MVC2, combinaison de :
<ul>
<li>une <a href="/org/us/company/oracle/sun/ptf/java/api/ee/Servlets.html">servlet</a> unique</li>
<li> des <strong>actions</strong> déclenchées par cette servlet (<a
href="/tech/info/soft/proj/design/pattern/index.html">DP</a> Commande/Action).</li>
</ul>
</li>
</ul>
<p>Lors de la réception d'une requête Web, la <a
href="/org/us/company/oracle/sun/ptf/java/api/ee/Servlets.html">servlet</a> de Struts examine l'<a
href="/tech/info/soft/net/internet/URL.html">URL</a> demandé et lui cherche une correspondance
(<em>mapping</em>) dans les classes d'actions spécifiées par le développeur. Une instance de cette classe d'action
est récupérée (d'un <a
href="/tech/info/soft/Pooling.html"><em>pool</em></a>) et exécutée. </p>
<p>Cette exécution effectue divers appels métiers, prépare généralement un formulaire (<em>form bean</em>) nécessaire
à la vue et retourne un code symbolique indiquant le résultat de son action. La servlet reçoit ce code et lui troue
une correspondance (<em>mapping</em>) de vue (<a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSP.html">JSP</a>)
à afficher.</p>
<p>La <a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSP.html">JSP</a> importe les balises Struts et les utilise
pour insérer simplement des données du formulaire (<em>form bean</em>) dans la page retournée à l'utilisateur.</p>
<h2><a href="/tech/info/soft/proj/impl/index.html">Implémentation</a></h2>
<p>Les formulaires sont des <strong>JavaBeans</strong> héritant de <code>org.apache.struts.action.ActionForm</code>.
Etant gérés dans un <a href="/tech/info/soft/Pooling.html">pool</a>, ils doivent avoir un constructeur par défaut.
</p>
<p>Les vues sont des <a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSP.html"><strong>JSP</strong></a> utilisant
des TagLibs Struts telles que :</p>
<ul>
<li><code>struts-html</code> pour la construction de code <a
href="/tech/info/soft/data/doc/html">HTML</a> (y compris formulaires depuis Struts 1.1)</li>
<li><code>struts-bean</code> pour l'accès aux propriétés de <a
href="/org/us/company/oracle/sun/ptf/java/api/se/beans">JavaBeans</a> (modèles) </li>
<li><code>struts-nested</code> pour la version de ces TagLib intégrant la notion de hiérarchie</li>
<li>etc.</li>
</ul>
<p>Tout formulaire se :</p>
<ol>
<li><strong>réinitialise</strong> via sa méthode <code>reset()</code></li>
<li><strong>remplit</strong> à partir d'une requête (soumission d'un formulaire HTML) via sa méthode <code>
populate()</code>
</li>
<li><strong>valide</strong> (accepte ou rejete les données qu'il contient) via sa méthode <code>validate()</code>.
</li>
</ol>
<h3>contrôleur</h3>
<p>Le contrôleur<strong> </strong>est constitué de :</p>
<ul>
<li>une <a href="/org/us/company/oracle/sun/ptf/java/api/ee/Servlets.html"><strong>servlet</strong></a> unique :
<code>org.apache.struts.action.ActionServlet</code> fournie par Struts ou dérivée</li>
<li>des <strong>actions</strong> à implémenter, dérivant de <code>org.apache.struts.action.Action</code>. En tant
que commande, une action n'a qu'à redéfinir le code de sa méthode <code>execute()</code> pour indiquer ce qu'elle
fait lorsqu'on l'invoque. Cette méthode retourne un <code>ActionForward</code> représentant le résultat de
l'exécution. C'est en fonction de ce résultat que la prochaine vue à afficher (ou autre action à exécuter) est
choisie d'après la configuration Struts. Cependant, plusieurs autres actions plus spécialisées sont disponibles :
<ul>
<li><code>DispachAction</code>, qui exécute telle ou telle méthode (pas uniquement <code>execute()</code>) en
fonction d'un <strong>paramètre</strong> de la requête soumise. Ceci est pratique lorsque l'action varie
fortement en fonction des paramètres (création, suppression, mise à jour par exemple).
<ul>
<li><code>LookupDispatchAction</code> qui considère le paramètre d'action comme provenant directement des
boutons de l'interface utilisateur.</li>
</ul>
</li>
<li><code>ForwardAction</code>, qui n'effectue rien d'autre que de rediriger vers une destination (une vue
typiquement). Ceci évite d'avoir à écrire des classes d'action aussi simples.</li>
</ul>
</li>
</ul>
<h3>Configuration</h3>
<p>Une <strong>WebApp </strong>utilisant Struts ajoute sous son répertoire <code>WEB-INF</code> un (ou plusieurs)
fichier(s) de configuration Struts définissant :</p>
<ul>
<li>les sources de données éventuelles. </li>
<li>les formulaires (<i>form-beans</i>)</li>
<li>les redirections globales (<i>global forwards</i>) </li>
<li>les correspondances (<i>action-mappings</i>) entre requêtes, actions à exécuter et formulaires utilisés</li>
<li>les ressources d'internationalisation</li>
</ul>
<blockquote>
<table>
<thead>
<tr>
<td colspan="2" rowspan="2">Struts</td>
<th> Version</th>
<th colspan="2"> 1</th>
<th rowspan="3"> Commentaire</th>
</tr>
<tr>
<th> Release</th>
<th>0</th>
<th>1</th>
</tr>
<tr>
<th> Module</th>
<th> Technologie</th>
<th>FixPack</th>
<th>1</th>
<th></th>
</tr>
<tr>
<th rowspan="4">Java</th>
<th colspan="2"><a href="/org/us/company/oracle/sun/ptf/java/api/se/">J2SE</a></th>
<td class="oui" colspan="2">1.2</td>
<td></td>
</tr>
<tr>
<th colspan="2"><a href="/org/us/company/oracle/sun/ptf/java/api/se/JDBC.html">JDBC</a></th>
<td class="oui" colspan="2">2.0</td>
<td>Optionnel</td>
</tr>
<tr>
<th colspan="2"><a href="/org/us/company/oracle/sun/ptf/java/api/ee/Servlets.html">Servlet</a></th>
<td class="oui" colspan="2">2.2</td>
<td></td>
</tr>
<tr>
<th colspan="2"><a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSP.html">JSP</a></th>
<td class="oui" colspan="2">1.1</td>
<td></td>
</tr>
</thead>
<tr>
<th rowspan="9"><a href="/org/int/asso/asf/Commons.html">Commons</a></th>
<th colspan="2">DBCP</th>
<td><code>GenericDataSource</code> (non JNDI)</td>
<td class="oui">Oui</td>
<td><i>DataBase Connection Pool</i></td>
</tr>
<tr>
<th colspan="2">File Upload</th>
<td></td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th colspan="2">Logging</th>
<td></td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th colspan="2"><a href="https://jakarta.apache.org/commons/pool.html">Pool</a></th>
<td></td>
<td class="oui">Oui</td>
<td><a href="/tech/info/soft/Pooling.html">Pooling</a> d'objets</td>
</tr>
<tr>
<th colspan="2">Services</th>
<td></td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th colspan="2">Validator</th>
<td>Contribution</td>
<td class="oui">Oui</td>
<td>Validation de formulaires via expressions régulières, code JavaScript généré</td>
</tr>
<tr>
<th colspan="2"><a href="https://jakarta.apache.org/commons/beanutils.html">BeanUtils</a></th>
<td><code>org.apache. struts.utils</code></td>
<td class="oui">Oui</td>
<td>Introspection via des scriplets</td>
</tr>
<tr>
<th colspan="2">Collections</th>
<td><code>org.apache. struts.utils</code></td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th colspan="2"><a href="https://jakarta.apache.org/commons/digester/">Digester</a></th>
<td><code>org.apache. struts.digester</code></td>
<td class="oui">Oui</td>
<td><a href="/tech/info/soft/data/doc/xml/">XML</a>Mapping XML vers Java, souvent utilisé pour la lecture de
fichiers de configuration.
</td>
</tr>
<tr>
<th><a href="/tech/info/soft/data/doc/xml">XML</a></th>
<th colspan="2"><a href="/org/us/company/oracle/sun/ptf/java/api/ext/JAXP.html">JAXP</a></th>
<td class="oui">1.0</td>
<td class="oui">1.1</td>
<td></td>
</tr>
<tr>
<th>DTD</th>
<th colspan="2">Message-Resources</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td>Internationalisation</td>
</tr>
<tr>
<th>Erreurs</th>
<th colspan="2">Declarative</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th rowspan="2">Formulaires</th>
<th colspan="2">ActionForm</th>
<td class="oui" colspan="2">Oui</td>
<td>Formulaires implémentés (classes)</td>
</tr>
<tr>
<th colspan="2">DynaBeans</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td>Formulaires déclaratifs (XML)</td>
</tr>
<tr>
<th rowspan="4">Actions</th>
<th colspan="2">Action</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th rowspan="2">DispachAction</th>
<th></th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th>LookupDispatchAction</th>
<td class="non"></td>
<td class="oui"></td>
<td></td>
</tr>
<tr>
<th colspan="2">ForwardAction</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th rowspan="16">TagLib</th>
<th colspan="2"><a href="https://jakarta.apache.org/struts/userGuide/dev_tiles.html">Tiles</a></th>
<td></td>
<td></td>
<td>Framework d'assemblage de <a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSP.html">JSP</a></td>
</tr>
<tr>
<th rowspan="9"><a href="https://jakarta.apache.org/struts/userGuide/dev_html.html">Html</a></th>
<th>options</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th>option</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th>optionsCollection</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td> Remplir des options HTML à partir d'une collection.</td>
</tr>
<tr>
<th>message</th>
<td class="oui" colspan="2">Oui</td>
<td> Insertion d'un libellé.</td>
</tr>
<tr>
<th>messages</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td> Itération d'une collection de messages dans la classe ActionMessages.</td>
</tr>
<tr>
<th> ActionForm</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th>image</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th>img</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th> SubmitTag, SelectTag, LinkTag.java, CheckboxTag, ButtonTag, ImageTag, RadioTag, and TextArea tags</th>
<td class="oui" colspan="2">Oui</td>
<td></td>
</tr>
<tr>
<th><a href="https://jakarta.apache.org/struts/userGuide/dev_logic.html">Logic</a></th>
<th>empty/notEmpty</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th colspan="2"><a href="https://jakarta.apache.org/struts/userGuide/dev_nested.html">Nested</a></th>
<td></td>
<td></td>
<td>Taglib</td>
</tr>
<tr>
<th rowspan="4"><a href="https://jakarta.apache.org/struts/userGuide/dev_bean.html">Beans</a></th>
<th>write</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th>cookie</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th>header</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th>parameter</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th rowspan="5">Util</th>
<th colspan="2"> LocalStrings</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td></td>
</tr>
<tr>
<th colspan="2">LabelValueBean</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td>Collection clés/valeurs utilisables pour la baslise <html:options> ou ailleurs.</td>
</tr>
<tr>
<th colspan="2">MessageResources</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td>Escape any single quote characters that are included in the specified message string.</td>
</tr>
<tr>
<th colspan="2">computeParameters</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td>Allow a transaction token to be the only parameter in .</td>
</tr>
<tr>
<th colspan="2">RequestUtils</th>
<td class="non">Non</td>
<td class="oui">Oui</td>
<td> Change to encode ampersands when building a query string.</td>
</tr>
</table>
</blockquote>
<h2>Notes</h2>
<ul>
<li> les formulaires
<ul>
<li>peuvent stocker des données relatives à une ou plusieurs
pages</li>
</ul>
</li>
<li>Les actions
<ul>
<li> appliquent le <a href="/tech/info/soft/proj/design/pattern/index.html">DP</a> Commande.</li>
<li>sont le prolongement du code de la servlet contrôleur, ce qui implique que :
<ul>
<li>elles ne sont pas <i><a href="/tech/info/soft/proj/design/arch/platform/Thread.html">thread</a>-safe</i>
</li>
<li>elles adaptent les requête <a href="/tech/info/soft/net/protocole/7/HTTP.html">HTTP</a> à la
véritable logique métier indépendante du Web (<a
href="/tech/info/soft/proj/design/pattern/index.html">DP</a> adaptateur)</li>
</ul>
</li>
</ul>
</li>
<li>les sources de données Struts
<ul>
<li>(obsolète) une (<code>GenericDataSource</code>) est livrée pour les infrastructures qui en manquent (<a
href="/org/int/asso/asf/server/web/apache/tomcat">Tomcat</a> par exemple).</li>
<li>ne sont pas recommandées à moins de ne disposez d'aucun pool de connexion (dans <a
href="/org/int/asso/asf/server/web/apache/tomcat">Tomcat</a> par exemple). En effet, elles ne sont pas
performantes et ne sont accessibles qu'à partir du <code>ServletContext</code> de la WebApp. Mieux vaut leurs
préferer les sources de données fournies par le serveur applicatif (<a
href="/org/us/company/ibm/product/soft/server/app/WAS.html">WAS</a>, <a
href="/org/us/company/oracle/bea/wls">WLS</a>), qui ont l'avantage d'être plus performantes et accessibles
via le service de nommage (API <a
href="/org/us/company/oracle/sun/ptf/java/api/JNDI.html">JNDI</a>). Des DataSource <a
href="/org/us/company/oracle/sun/ptf/java/api/JNDI.html">JNDI</a> existent depuis Struts 1.1
</li>
</ul>
</li>
<li>Le travail d'initialisation/de terminaison peut être réalisé via un plugin Struts plutôt que par une servlet de
contrôle spécialisant celle de Struts.</li>
</ul>
</section>
<h2>Exemples</h2>
<ul>
<li>Actions
<ul>
<li><a
href="https://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/kicsa/Java/org/orange/kicsa/presentation/control/skill/">Gestion
des compétences KiCsa</a></li>
</ul>
</li>
<li>Configuration Struts
<ul>
<li><a
href="https://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/kicsa/WebAoo/WEB-INF/struts-config.xml?rev=1.1.1.1&content-type=text/vnd.viewcvs-markup">Configuration
Struts de KiCsa</a></li>
</ul>
</li>
<li>JSP Struts
<ul>
<li><a href="https://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/kicsa/WebAoo/">JSP de la WebApp KiCsa</a></li>
</ul>
</li>
</ul>
<section>
<h2>Limitations</h2>
<ul>
<li>Pas de vérification de la provenance lors de l'exécution d'une action (pas d'automate en somme).</li>
<li>Commence à être relativement obsolète, notamment à cause de sa contraire de compatibilité ascendante. Voir son
successeur <a href="/org/int/asso/asf/server/web/apache/Shale.html">Shale</a>. </li>
</ul>
</section>
<section>
<h2>Voir</h2>
<ul>
<li>Struts
<ul>
<li><a href="https://apache.i-connexion.net/dist/jakarta/struts/binaries">Téléchargement</a></li>
<li><a href="https://jakarta.apache.org/struts/userGuide">Guide de l'utilisateur</a></li>
<li><a href="https://jakarta.apache.org/struts/api">API</a></li>
<li><a href="https://rollerjm.free.fr/pro/Struts.html">Validateur </a>
<ul>
<li><a href="https://home.earthlink.net/%7Edwinterfeldt">Struts validator</a> par David winterfeldt</li>
</ul>
</li>
<li>Didacticiel
<ul>
<li><a href="https://www.reumann.net/do/struts/main">Struttin' with Struts</a> de <a
href="mailto:struts@reumann.net">Rick Reumann</a></li>
<li><a href="https://www.onjava.com/pub/a/onjava/2002/10/30/jakarta.html?page=1">Jakarta Struts : Seven
lessons from the trenches</a> de <a href="https://www.onjava.com/pub/au/988">Chuck Cavaness</a>
(onJava.com)</li>
</ul>
</li>
</ul>
</li>
<li>Alternatives/compléments
<ul>
<li><a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSTL.html">JSTL</a></li>
<li><a href="/org/us/company/oracle/sun/ptf/java/api/ee/JSF.html">JSF</a></li>
<li><a href="https://tapestry.sourceforge.net">Tapestry</a></li>
</ul>
</li>
<li>Développement
<ul>
<li>Javanovic <a href="https://www.javanovic.com/products/karapan-sapi.html">Karapan Sapi Struts Generator</a>
</li>
</ul>
</li>
<li>Test
<ul>
<li><a href="https://strutstestcase.sourceforge.net/">Struts TestCase for JUnit</a> - Test des actions Struts
hors ou à l'intérieur d'un conteneur Web.</li>
</ul>
</li>
<li>Husted - <a href="https://www.husted.com/struts/">More about Struts</a></li>
<li><a href="https://rollerjm.free.fr/pro/Struts.html">Struts controller UML diagram</a> par Jean-Michel Garnier
</li>
<li>2002 AJUG Meeting - <a href="https://www.ajug.org/meetings/download/ajug.pdf">Struts: MVC framework for JSP</a>
</li>
<li>2002 AJUG Meeting - <a href="https://www.ajug.org/meetings/download/struts.pdf">Java Struts 1.1: Ready for prime
time</a></li>
</ul>
</section>
<!--#include virtual="/footer.html" -->