Developpez.com

Une très vaste base de connaissances en informatique avec
plus de 100 FAQ et 10 000 réponses à vos questions

Application Struts pas à pas avec Eclipse (Web Tools Platform) et Tomcat

Struts


précédentsommairesuivant

V. AFFICHAGE DE DONNEES EN BASE

V-A. Etape 4 : Création de la base de données

V-A-1. Installation et lancement de HSQLDB

Décompresser le fichier "hsqldb_1_8_0_10.zip" à la racine du disque C.

Lancer le manager de HSQLDB grâce à la commande ""C:\Program Files\Java\jre1.5.0_17\bin\java" -classpath c:\hsqldb\lib\hsqldb.jar org.hsqldb.util.DatabaseManager".

Image non disponible

Saisir "maBase" dans "Setting Name", "HSQL Database Engine Standalone" dans "Type", "jdbc:hsqldb:file:C:\hsqldb\data\maBase" dans "URL". Cliquer sur "OK".

Image non disponible

V-A-2. Création de la table "LISTECOURSES"

Saisir la requête :

 
Sélectionnez
CREATE TABLE LISTECOURSES(IDOBJET INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY,  LIBELLE VARCHAR, QUANTITE INTEGER);

Cliquer sur "Execute".

Image non disponible

Aller dans le menu "View". Cliquer sur "Refresh Tree", afin que la nouvelle table apparaisse dans l'arbre à gauche. Cliquer sur "Execute".

Image non disponible

V-A-3. Insertion des données

Saisir la requête :

 
Sélectionnez
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Banane', 3); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Sucre blanc', 75); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Oeuf', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Levure', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Sel', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Farine', 150); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Beurre', 70); 

Cliquer sur "Execute".

Image non disponible

Aller dans le menu "Options". Cliquer sur "Commit".

Image non disponible

Fermer le manager HSQLDB.

V-A-4. Vérification

Lancer le manager de HSQLDB grâce à la commande "C:\Program Files\Java\jre1.5.0_16\bin\java" -classpath c:\hsqldb\lib\hsqldb.jar org.hsqldb.util.DatabaseManager".

Image non disponible

Choisir "maBase" dans "Recent". Cliquer sur "OK".

Image non disponible

Saisir la requête :

 
Sélectionnez
SELECT * FROM LISTECOURSES;

Cliquer sur "Execute".

Image non disponible

V-B. Etape 5 : Développement de l'affichage

V-B-1. Déclaration de la ressource dans "web.xml"

Ajouter la déclaration de l'utilisation par l'application de la ressource dans le fichier "web.xml".

 
Sélectionnez
	<!-- Action Servlet Mapping -->
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

	<!-- Declaration de l'utilisation de la ressource JDBC -->
	<resource-ref>
		<description>Ressource JDBC de l'application</description>
		<res-ref-name>jdbc/dsMonApplication</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
Image non disponible

V-B-2. Création de la classe de bean

Faire clic droit sur "Java Resources: src". Choisir "New"/"Class".

Image non disponible

Saisir "com.developpez.rpouiller.monapplication" dans "Package", "ElementCourseBean" dans "Name". Cliquer sur "Finish".

Image non disponible

Saisir le code suivant pour le bean.

 
Sélectionnez
package com.developpez.rpouiller.monapplication;

import java.io.Serializable;

public class ElementCourseBean implements Serializable {
	
	private static final long serialVersionUID = 58409687792501803L;
	
	private Long idObjet;
	private String libelle;
	private Integer quantite;
	
	public Long getIdObjet() {
		return idObjet;
	}
	
	public void setIdObjet(Long idObjet) {
		this.idObjet = idObjet;
	}
	
	public String getLibelle() {
		return libelle;
	}
	
	public void setLibelle(String libelle) {
		this.libelle = libelle;
	}
	
	public Integer getQuantite() {
		return quantite;
	}
	
	public void setQuantite(Integer quantite) {
		this.quantite = quantite;
	}
}

V-B-3. Création de la classe de bean de retour de la DAO

Créer une classe "RetourRechercherBean" dans le package "com.developpez.rpouiller.monapplication".

Saisir le code suivant pour le bean.

 
Sélectionnez
package com.developpez.rpouiller.monapplication;

import java.io.Serializable;
import java.util.List;

public class RetourRechercherBean implements Serializable {

	private static final long serialVersionUID = 1050432583446929484L;

	private String erreur;
	private List<ElementCourseBean> listeCourses;

	public String getErreur() {
		return erreur;
	}

	public void setErreur(String erreur) {
		this.erreur = erreur;
	}

	public List<ElementCourseBean> getListeCourses() {
		return listeCourses;
	}

	public void setListeCourses(List<ElementCourseBean> listeCourses) {
		this.listeCourses = listeCourses;
	}
}

V-B-4. Création de la classe DAO accédant à la base de données

Créer une classe "ListeCoursesDAO" dans le package "com.developpez.rpouiller.monapplication".

Saisir le code suivant pour la DAO.

 
Sélectionnez
package com.developpez.rpouiller.monapplication;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ListeCoursesDAO {

	private final static String NOM_RESOURCE_JDBC = "java:comp/env/jdbc/dsMonApplication";
	
	/**
	 * Retourne la liste des courses stockées dans la base.
	 * @return La liste des courses/erreurs.
	 */
	public RetourRechercherBean rechercherElementsCourses() {
		final RetourRechercherBean lRetourRechercher = new RetourRechercherBean();
		
		try {
			final Context lContext = new InitialContext();
			final DataSource lDataSource = (DataSource) lContext.lookup(NOM_RESOURCE_JDBC);

			final List<ElementCourseBean> lListeCourses = new LinkedList<ElementCourseBean>();
			
			final Connection lConnection  = lDataSource.getConnection();
			final Statement lStatement = lConnection.createStatement();
			final ResultSet lResultSet = lStatement.executeQuery("SELECT * FROM LISTECOURSES");
			
			while (lResultSet.next()) {
				final ElementCourseBean lElementCourse = new ElementCourseBean();
				
				final Long lIdObjet = lResultSet.getLong("IDOBJET");
				final String lLibelle = lResultSet.getString("LIBELLE");
				final Integer lQuantite = lResultSet.getInt("QUANTITE");
				
				lElementCourse.setIdObjet(lIdObjet);
				lElementCourse.setLibelle(lLibelle);
				lElementCourse.setQuantite(lQuantite);
				
				lListeCourses.add(lElementCourse);
			}
			
			lRetourRechercher.setListeCourses(lListeCourses);
		} catch (NamingException e) {
			// Trace l'erreur dans la log du serveur
			e.printStackTrace();
			// Stocke l'erreur dans le retour
			lRetourRechercher.setErreur("NamingException : " + e.getMessage());
		} catch (SQLException e) {
			// Trace l'erreur dans la log du serveur
			e.printStackTrace();
			// Stocke l'erreur dans le retour
			lRetourRechercher.setErreur("SQLException : " + e.getMessage());
		}
		
		return lRetourRechercher;
	}
}

V-B-5. Création de la classe Action d'affichage

Créer une classe "AfficherListeCoursesAction" dans le package "com.developpez.rpouiller.monapplication".

Saisir le code suivant pour l'action.

 
Sélectionnez
package com.developpez.rpouiller.monapplication;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

public class AfficherListeCoursesAction extends Action {

	public ActionForward execute(final ActionMapping pMapping,
			ActionForm pForm, final HttpServletRequest pRequete,
			final HttpServletResponse pReponse) {

		// Récupère les informations dans la base
		final ListeCoursesDAO lListeCoursesDAO = new ListeCoursesDAO();
		final RetourRechercherBean lRetourRechercher = lListeCoursesDAO.rechercherElementsCourses();
		
		if(lRetourRechercher.getErreur() == null) {
			// Stocke les informations dans la requête
			pRequete.setAttribute("LISTE_COURSES", lRetourRechercher.getListeCourses());
			// S'il n'y a pas d'erreurs, on retourne le forward "succes"
			return pMapping.findForward("succes");
		}
		else {
			final ActionMessages lErreurs = getErrors(pRequete);
			final ActionMessage lActionMessage = new ActionMessage(lRetourRechercher.getErreur(), false);
			lErreurs.add(Globals.ERROR_KEY, lActionMessage);
			saveErrors(pRequete, lErreurs);
			// S'il y a des erreurs, on retourne le forward "erreur"
			return pMapping.findForward("erreur");
		}
	}
}

V-B-6. Création de la JSP d'affichage de la liste de courses

Créer une nouvelle JSP "listeCourses.jsp" dans "pages".

Saisir le code suivant pour la JSP.

 
Sélectionnez
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
<%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %>
<html:html>
	<head>
		<title><bean:message key="titre.listecourses"/></title>
	</head>
	<body>
		<table border="1">
			<thead>
				<tr>
					<th><bean:message key="colonne.identifiant"/></th>
					<th><bean:message key="colonne.libelle"/></th>
					<th><bean:message key="colonne.quantite"/></th>
				</tr>
			</thead>
			<tbody>
				<logic:iterate id="elementCourse" name="LISTE_COURSES" type="com.developpez.rpouiller.monapplication.ElementCourseBean">
					<tr>
						<td><bean:write name="elementCourse" property="idObjet"/></td>
						<td><bean:write name="elementCourse" property="libelle"/></td>
						<td><bean:write name="elementCourse" property="quantite"/></td>
					</tr>
				</logic:iterate>
			</tbody>
		</table>		
	</body>
</html:html>

V-B-7. Création de la JSP d'erreur

Créer une nouvelle JSP "erreur.jsp" dans "pages".

Saisir le code suivant pour la JSP.

 
Sélectionnez
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
<html:html>
	<head>
		<title><bean:message key="titre.erreur"/></title>
	</head>
	<body>
		<html:errors/><br/>
	</body>
</html:html>

V-B-8. Modification du fichier d'internationalisation

Ajouter les lignes suivantes dans le fichier "Resources.properties".

 
Sélectionnez
titre.listecourses=Liste de courses
colonne.identifiant=IDOBJET
colonne.libelle=LIBELLE
colonne.quantite=QUANTITE

titre.erreur=Erreur
Image non disponible

V-B-9. Modification du fichier de configuration "struts-config.xml"

Ajouter les lignes suivantes dans le fichier "struts-config.xml" (les lignes doivent être avant la déclaration du fichier d'internationalisation).

 
Sélectionnez
  <!-- ========== Mapping des actions ============================== -->
  <action-mappings>

	<!-- Indique la correspondance entre une action sous forme d'URL (ici /AfficherListeCourses.do), 
		une classe (ici com.developpez.rpouiller.monapplication.AfficherListeCoursesAction) -->
    <action    path      = "/AfficherListeCourses"
               type      = "com.developpez.rpouiller.monapplication.AfficherListeCoursesAction">
               
        <forward name="succes" path="/pages/listeCourses.jsp"  />
        <forward name="erreur" path="/pages/erreur.jsp"  />
    </action>
  </action-mappings>
Image non disponible

V-C. Etape 6 : Configuration de Tomcat

V-C-1. Déclaration de la ressource JDBC dans le serveur

Ouvrir le fichier "server.xml" du serveur Tomcat (paramétrage accessible depuis Eclipse).

Ajouter la déclaration de la ressource JNDI dans les ressources globales (partie "GlobalNamingResources").

 
Sélectionnez
    <Resource auth="Container" driverClassName="org.hsqldb.jdbcDriver"
    			maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/dsMaBase"
    			password="" type="javax.sql.DataSource" url="jdbc:hsqldb:file:C:\hsqldb\data\maBase"
    			username="sa" />
Image non disponible

V-C-2. Déclaration du lien de la ressource

Ouvrir le fichier "context.xml" du serveur Tomcat (paramétrage accessible depuis Eclipse).

Ajouter la déclaration du lien entre de la ressource globale et la déclaration dans l'application.

 
Sélectionnez
	<ResourceLink name="jdbc/dsMonApplication" global="jdbc/dsMaBase"
		type="javax.sql.DataSource" />
Image non disponible

V-C-3. Copie de la librairie HSQLDB dans les librairies Tomcat

Copier la librairie "hsqldb.jar" depuis le zip "hsqldb_1_8_0_10.zip" dans les librairies de Tomcat ("C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib").

Image non disponible

V-C-4. Déploiement de l'application

Si le serveur est à l'état "Restart" (Il faut qu'il soit à l'état "Synchronized") : Sélectionner le serveur Tomcat dans la vue "Servers". Faire un clic droit sur le serveur Tomcat. Puis sélectionner "Restart".

Image non disponible

Ouvrir un navigateur web à l'adresse : http://localhost:8080/MonApplication/AfficherListeCourses.do.

Image non disponible

Si l'application est en erreur, comme dans l'image. Il faut redémarrer Eclipse. Et une fois Eclipse redémarré, redémarrer le serveur Tomcat.

Image non disponible

V-D. Fonctionnement de l'ensemble

Au démarrage du serveur Tomcat, le fichier "server.xml" déclare une ressource JDBC globale avec ses paramètres de connexion.

Le fichier "context.xml" définit un mappage entre une ressource JDBC déclarée dans une application et la ressource JDBC globale.

Au démarrage de l'application, le fichier "web.xml" indique que les urls finissant par ".do" sont mappées vers la servlet "org.apache.struts.action.ActionServlet". Le fichier indique également que l'application utilise la ressource JDBC "jdbc/dsMonApplication"

Le fichier de configuration "struts-config.xml" déclare une action "com.developpez.rpouiller.monapplication.AfficherListeCoursesAction". Cette action peut être suivie lors de son exécution de deux JSP ("/pages/listeCourses.jsp" ou "/pages/erreur.jsp") selon la direction décidée dans l'action.

Lors de l'appel "http://localhost:8080/MonApplication/AfficherListeCourses.do", la servlet "org.apache.struts.action.ActionServlet" est exécutée (url terminée par ".do"). Elle utilise le mapping des actions contenues dans "struts-config.xml", pour appeler l'action "com.developpez.rpouiller.monapplication.AfficherListeCoursesAction".

L'action appelle la DAO afin d'obtenir la liste des enregistrements contenus en base. Elle stocke la liste des enregistrements dans la "requête". Si tout s'est bien passé, elle demande de forwarder vers le mapping "succes" ("/pages/listeCourses.jsp"). Ou en cas d'erreur, elle demande de forwarder vers le mapping "erreur" ("/pages/erreur.jsp").

La DAO "ListeCoursesDAO" utilise la ressource JDBC pour accéder à la base. Elle fournit une méthode retournant les informations contenues dans la table "LISTECOURSES".

La JSP "/pages/listeCourses.jsp" affiche un tableau avec les valeurs contenues dans la requête. Le tag "logic:iterate" effectue une boucle sur les élément de la liste des courses qui a été stockée dans la requête sous le nom "LISTE_COURSES". A chaque itération, l'élément courant de la liste possède le nom "elementCourse" et est de classe "com.developpez.rpouiller.monapplication.ElementCourseBean". Chaque tag "bean:write" affiche une propriété (property) de l'élément courant.

La JSP "/pages/erreur.jsp" affiche les erreurs stockées dans la requête. Le tag "html:errors" affiche les erreurs qui ont été ajoutées dans la requête par la classe d'affichage.


précédentsommairesuivant

  

Copyright © 2008 Régis POUILLER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.