IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Problème d'affichage des données avec c:forEach sur page jsp


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 205
    Points : 102
    Points
    102
    Par défaut Problème d'affichage des données avec c:forEach sur page jsp
    Bonjour,
    J'ai un problème pour afficher les données provenant de ma bdd sur ma page jsp.
    Sur la balise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:forEach var="p" items="${produits}">
    il y a un warning d'eclipse, avec ce message
    A problem was encountered using TagExtraInfo class org.apache.taglibs.standard.tei.ForEachTEI for 'c:forEach'
    J'ai essayé plusieurs solutions trouvées sur le web mais aucune n'a marché.


    Page jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <%@ page language="java" contentType="text/html; charset=UTF-8" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     <table border="1">
    		<tr>
    			<th>DESIGNATION</th>
    			<th>PRIX</th>
    			<th>POIDS</th>
    			<th>DATE PEREMPTION</th>
    		</tr>	
    		<c:forEach var="p" items="${produits}">
    			<tr>
    				<td><c:out value="${p.getDesignation}" /></td>
    				<td><c:out value="${p.getPrix}" /></td>
    				<td><c:out value="${p.getPoids}" /></td>
    				<td><c:out value="${p.getDatePeremption}" /></td>
    			</tr>	
    		</c:forEach>
    	</table>

    Class Connexion BDD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class ConnexionDB {
    	private static Connection connection;
     
    	static {
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
     
    			String url = "jdbc:mysql://localhost:3306/gestionproduit";
    			String user = "root";
    			String pass = "";
     
    			connection = DriverManager.getConnection(url, user, pass);
    		}
    		catch(SQLException | ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public static Connection getConnection() {
    		return connection;
    	}
     
    }
    Class Model
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public class ProduitDAOImpl implements IProduit{
    	Connection con = null;
    	PreparedStatement ps = null;
    	ResultSet rs = null;
     
    	@SuppressWarnings("unused")
    	public List<ProduitBean> getListeProduit() {
    		List<ProduitBean> produit = new ArrayList<ProduitBean>();
     
    		try{
     
    			 con = ConnexionDB.getConnection();
    			 ps = con.prepareStatement("SELECT * FROM produit");
    			 rs = ps.executeQuery();
     
    			while(rs.next()) {
     
    				String designation = rs.getString("designation");
    				Double prix = rs.getDouble("prix");
    				Double poids = rs.getDouble("poids");
    				Date datePeremption = rs.getDate("datePeremption");
     
    				ProduitBean ListProduit = new ProduitBean();
    				ListProduit.setDesignation(designation);
    				ListProduit.setPrix(prix);
    				ListProduit.setPoids(poids);
    				ListProduit.setDatePeremption(datePeremption);
     
    				produit.add(ListProduit);
    			}
    		}
    		catch(SQLException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if(rs != null) {
    					rs.close();
    				}
     
    				if(ps != null) {
    					ps.close();
    				}
     
    				if(con != null) {
    					con.close();
    				}
    			} catch(SQLException ignore){
     
    			}
    		}
     
    		return produit;
    	}}
    Class java Bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    public class ProduitBean {
    	private int id;
    	private String designation ;
    	private Double prix;
    	private Double poids;
    	private Date datePeremption;
     
    	public ProduitBean() {
    		super();
    	}
     
    	public ProduitBean(String designation, Double prix, Double poids, Date dateperemption) {
    		this.designation = designation;
    		this.prix = prix;
    		this.poids = poids;
    		this.datePeremption = dateperemption;
    	}
     
    	public ProduitBean(int id, String designation, Double prix, Double poids, Date dateperemption) {
    		this.id = id;
    		this.designation = designation;
    		this.prix = prix;
    		this.poids = poids;
    		this.datePeremption = dateperemption;
    	}
     
    	public int getId() {
    		return id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
    	public String getDesignation() {
    		return designation;
    	}
     
    	public void setDesignation(String designation) {
    		this.designation = designation;
    	}
     
    	public Double getPrix() {
    		return prix;
    	}
     
    	public void setPrix(Double prix) {
    		this.prix = prix;
    	}
     
    	public Double getPoids() {
    		return poids;
    	}
     
    	public void setPoids(Double poids) {
    		this.poids = (double) poids;
    	}
     
    	public Date getDatePeremption() {
    		return datePeremption;
    	}
     
    	public void setDatePeremption(Date datePeremption2) {
    		this.datePeremption = datePeremption2;
    	}
     
    }

    NB : lorsque j'instancie la connexion et lance la requête directement dans dans ma page avec un while next, les données s'affichent sans problème
    Nom : Capture d’écran 2023-09-25 à 16.19.10.png
Affichages : 242
Taille : 27,2 Ko

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 477
    Points : 941
    Points
    941
    Billets dans le blog
    5
    Par défaut
    Beaucoup de chose me gène dans la classe ProduitDAOImpl qui montre un manque de maitrise dans les concepts de bases d'architectures ainsi sur les bonnes pratiques Java.

    Le fait d'utiliser du code JDBC dans des .jsp va dans ce sens.

    Je vais dans ce post m'atteler à la classe ProduitDAOImpl.

    Pour commencer, il y a un problème de nommage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class ProduitDAOImpl implements IProduit{
    Doit être remplacé par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class ProduitDAOImpl implements ProduitDAO{
    On parle d'une DAO, qui sert à interroger une base de donnée. Par le "DAO", on sait ce que fait l'interface.

    Il est néanmoins normale que cette classe implémente ProduitDAO (en se basant sur un bon nommage), dans les classes externes, qui utiliseront ProduitDAO, on doit voir le contrat (traduction l'implémentation), pas l'implémentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @SuppressWarnings("unused")
    public List<ProduitBean> getListeProduit() {
    Doit être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Override
    public List<ProduitBean> getListeProduit() {
    Dans l'interface ProduitDAO, on met à disposition de l'utilisateur la méthode getListeProduit() . Dans la classe, on donne une implémentation pure et dur. C'est masqué pour l'utilisateur, vu que l'on ne présente à l'utilisateur que le contrat, et que l'on masque les détails d'implémentation.

    Le @Override permet de signaler que l'on donne une implémentation à une méthode définie dans le contrat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    } catch(SQLException ignore){
     
    			}
    Non, Non, Non et non, Zéro. Ce type de code est inadmissible.
    Il faut toujours traiter les exception (un simple log suffit).

    Imagine, la BDD plante, et là, ben l'utilisateur ne le sait pas!

    A minima, on log (c'est un traitement comme un autre). On peut aussi jeter (throw).
    Mais on traite toujours une exception.

    En général, je recommande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ProduitDAO{
     
      List<ProduitBean> getListeProduit() throws DAOException
    }
    On explique que dans le contrat, on jette une exception ce qui est normal (genre: la BDD vient de tomber en rade ce qui est normal avec MySQL, mais je m'égare).

    Du coup, on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    } catch(SQLException ignore){
       throw new DAOException(e); 
    }
    Et enfin les try-with-ressources.

    Effectivement, il faut toujours fermer ce qui peut l'être.

    Ce qui donne le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    finally {
    			try {
    				if(rs != null) {
    					rs.close();
    				}
     
    				if(ps != null) {
    					ps.close();
    				}
     
    				if(con != null) {
    					con.close();
    				}
    			} catch(SQLException ignore){
     
    			}
    		}
    Seulement, c'est un peut lourd.

    Or, ce code, c'est jusqu'à Java 6. A partir de Java 7, on a l'interface AutoClosable:
    https://docs.oracle.com/javase/8/doc...Closeable.html

    Grace à cette interface, si on l'utilise dans un try-with-ressource, on va automatiquement la fermer. Et de manière simple.

    Et en général, tout ce qui se ferme est autoclosable!
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    try{
     
    			 con = ConnexionDB.getConnection();
    			 ps = con.prepareStatement("SELECT * FROM produit");
    			 rs = ps.executeQuery();
     
    			while(rs.next()) {
     
    				String designation = rs.getString("designation");
    				Double prix = rs.getDouble("prix");
    				Double poids = rs.getDouble("poids");
    				Date datePeremption = rs.getDate("datePeremption");
     
    				ProduitBean ListProduit = new ProduitBean();
    				ListProduit.setDesignation(designation);
    				ListProduit.setPrix(prix);
    				ListProduit.setPoids(poids);
    				ListProduit.setDatePeremption(datePeremption);
     
    				produit.add(ListProduit);
    			}
    		}
    		catch(SQLException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if(rs != null) {
    					rs.close();
    				}
     
    				if(ps != null) {
    					ps.close();
    				}
     
    				if(con != null) {
    					con.close();
    				}
    			} catch(SQLException ignore){
     
    			}
    		}
    Doit être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    try( Connection con = ConnexionDB.getConnection();  PreparedStatement ps =  con.prepareStatement("SELECT * FROM produit");ResultSet rs =   rs = ps.executeQuery()){
     
    			while(rs.next()) {
     
    				String designation = rs.getString("designation");
    				Double prix = rs.getDouble("prix");
    				Double poids = rs.getDouble("poids");
    				Date datePeremption = rs.getDate("datePeremption");
     
    				ProduitBean ListProduit = new ProduitBean();
    				ListProduit.setDesignation(designation);
    				ListProduit.setPrix(prix);
    				ListProduit.setPoids(poids);
    				ListProduit.setDatePeremption(datePeremption);
     
    				produit.add(ListProduit);
    			}
    		}
    		catch(SQLException e) {
    			throw new DAOException(e);
    		}

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 477
    Points : 941
    Points
    941
    Billets dans le blog
    5
    Par défaut
    Dans la seconde réponse, je vais m'attarder sur la séparation des rôles et l'injection de dépendance.

    L'injection de dépendance est une pratique qui est dans le D ( https://fr.wikipedia.org/wiki/Invers...C3%A9pendances ) de SOLID ( https://fr.wikipedia.org/wiki/SOLID_(informatique) ).

    En général, on utilise un moteur d'injection de dépendance/inversion de contrôle qui instancie les objets qui feront fonctionner l'application.
    On a:


    Pour commencer, comme je l'ai indiqué précédemment, je construirais un contrat pour ma BDD.

    Dans mon projet:
    https://bitbucket.org/philippegibaul...r40k/src/main/

    https://bitbucket.org/philippegibaul...iguration.java


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    package com.calculateur.warhammer.base.server;
     
    /**
     * Interface pour la configuration en BDD
     * @author phili
     *
     */
    public interface IDatabaseConfiguration {
     
    	/**
    	 * 
    	 * @return URL
    	 */
    	String getUrl();
     
    	/**
    	 * 
    	 * @return URL JDBC
    	 */
    	String getJDBCUrl();
     
    	/**
    	 * 
    	 * @return User
    	 */
    	String getUser();
     
    	/**
    	 * 
    	 * @return Password
    	 */
    	String getPassword();
     
    	/**
    	 * 
    	 * @return port
    	 */
    	String getPort();
     
    	/**
    	 * 
    	 * @return Le Driver JDBC
    	 */
    	String getClassDriver();
     
    	/**
    	 * 
    	 * @return Un String donnant les informations de la BDD
    	 */
    	String getInformations();
    }
    Intérêt: On peut changer de BDD à la volée. Le but est juste de regrouper les informations d'une BDD.

    J'ai 1 implémentation pour PostgreSQL et 1 pour H2:
    https://bitbucket.org/philippegibaul...urationH2.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    package com.calculateur.warhammer.dao.h2;
     
    import java.io.File;
    import java.io.IOException;
     
    import org.apache.commons.io.FileUtils;
    import org.h2.Driver;
     
    import com.calculateur.warhammer.base.server.IDatabaseConfiguration;
     
    import jakarta.annotation.PostConstruct;
    import jakarta.annotation.PreDestroy;
     
    /**
     * La configuration pour une Base de donnée H2
     * 
     * @author phili
     *
     */
    public class ConfigurationH2 implements IDatabaseConfiguration {
     
    	private static final String USER = "sa";
     
    	private static final String USER_PASSWORD = "sa";
     
    	private File useFile;
     
    	private final File initialFile;
     
    	private final File copiedFile;
     
    	private final Integer port;
     
    	private final String path;
     
    	private final String databaseName;
     
    	public ConfigurationH2(File initialFile, File copiedFile, Integer port, String path, String databaseName) {
    		this.initialFile = initialFile;
    		this.copiedFile = copiedFile;
    		this.port = port;
    		this.path = path;
    		this.databaseName = databaseName;
    	}
     
    	@PostConstruct
    	public void init() throws IOException {
    		if (copiedFile != null) {
    			FileUtils.copyDirectory(initialFile, copiedFile);
    			useFile = copiedFile;
    		} else {
    			useFile = initialFile;
    		}
    	}
     
    	@PreDestroy
    	private void destroy() throws IOException {
    		if (copiedFile != null && copiedFile.listFiles() != null) {
    			for(File file:copiedFile.listFiles()) {
    				FileUtils.deleteDirectory(file);
    			}
    		}
    	}
     
    	@Override
    	public String getUrl() {
    		return useFile.getAbsolutePath();
    	}
     
    	@Override
    	public String getJDBCUrl() {
    		StringBuilder sb = new StringBuilder("jdbc:h2:file:");
    		sb.append(useFile.getAbsolutePath());
    		sb.append("/");
    		sb.append(path);
    		sb.append("/");
    		sb.append(databaseName);
    		return sb.toString();
    	}
     
    	@Override
    	public String getUser() {
    		return USER;
    	}
     
    	@Override
    	public String getPassword() {
    		return USER_PASSWORD;
    	}
     
    	@Override
    	public String getPort() {
    		return port.toString();
    	}
     
    	@Override
    	public String getClassDriver() {
    		return Driver.class.getName();
    	}
     
    	@Override
    	public String getInformations() {
    		return null;
    	}
    }
    https://bitbucket.org/philippegibaul...ostgresql.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    package com.calculateur.warhammer.dao.postgresql;
     
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    import org.postgresql.Driver;
     
    import com.calculateur.warhammer.base.server.IDatabaseConfiguration;
     
    /**
     * Configuration PostgresQL
     * @author phili
     *
     */
    public class ConfigurationPostgresql implements IDatabaseConfiguration{
     
    	private static final Logger LOGGER = Logger.getLogger(ConfigurationPostgresql.class.getName());
     
    	private final String host;
    	private final String login;
    	private final String password;
    	private final String port;
    	private final String database;
    	private final String properties;
     
    	public ConfigurationPostgresql(String host, String login, String password, String port, String database,
    			String properties) {
    		this.host = host;
    		this.login = login;
    		this.password = password;
    		this.port = port;
    		this.database = database;
    		this.properties = properties;
    		LOGGER.log(Level.INFO,getInformations());
    	}
     
    	@Override
    	public String getUrl() {
    		return host;
    	}
     
    	@Override
    	public String getJDBCUrl() {
    		StringBuilder sb = new StringBuilder("jdbc:postgresql://");
    		sb.append(host);
    		sb.append(":");
    		sb.append(port);
    		sb.append("/");
    		sb.append(database);
    		if(properties != null && !properties.isEmpty()) {
    			sb.append("?");
    			sb.append(properties);
    		}
    		return sb.toString();
    	}
     
    	@Override
    	public String getUser() {
    		return login;
    	}
     
    	@Override
    	public String getPassword() {
    		return password;
    	}
     
    	@Override
    	public String getPort() {
    		return port;
    	}
     
    	@Override
    	public String getClassDriver() {
    		return Driver.class.getName();
    	}
     
    	@Override
    	public String getInformations() {
    		StringBuilder sb = new StringBuilder();
    		sb.append("Information BDD Postgres:").append("\n");
    		sb.append("    host: ").append(getUrl()).append("\n");
    		sb.append("    user: ").append(getUser()).append("\n");
    		sb.append("    database name: ").append(database).append("\n");
    		sb.append("    jdbc: ").append(getJDBCUrl()).append("\n");
    		return sb.toString();
    	}
    }
    On imagine que l'on peut faire une implémentation pour MySQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class ConfigurationMySQL implements IDatabaseConfiguration
    Ensuite, le contrat DAO pour l'utilisateur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface ProduitDAO{
     
      List<ProduitBean> getListeProduit() throws DAOException
    }
    Ici, on définit un contrat pour un utilisateur, une interface.

    L'implémentation aura besoin des données de la BDD pour fonctionnner. Il faudra donc injecter les paramètres de la BDD pour fonctionner. On va le faire par injection de dépendance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public class ProduitDAOImpl implements ProduitDAO{
      private final IDatabaseConfiguration configuration;
     
      public ProduitDAOImpl(IDatabaseConfiguration configuration){
        this.configuration = configuration;
      }
     
     @Override
     public List<ProduitBean> getListeProduit() throws DAOException{
                    try {
    			Class.forName(configuration.getClassDriver());
    		} catch (ClassNotFoundException e) {
    			throw new DAOException(e);
    		}
     
    		List<ProduitBean> produit = new ArrayList<ProduitBean>();
     
    		try( Connection con = DriverManager.getConnection(configuration.getJDBCUrl(), configuration.getUser(),configuration.getPassword());  PreparedStatement ps =  con.prepareStatement("SELECT * FROM produit");ResultSet rs =   rs = ps.executeQuery()){
     
    			while(rs.next()) {
     
    				String designation = rs.getString("designation");
    				Double prix = rs.getDouble("prix");
    				Double poids = rs.getDouble("poids");
    				Date datePeremption = rs.getDate("datePeremption");
     
    				ProduitBean ListProduit = new ProduitBean();
    				ListProduit.setDesignation(designation);
    				ListProduit.setPrix(prix);
    				ListProduit.setPoids(poids);
    				ListProduit.setDatePeremption(datePeremption);
     
    				produit.add(ListProduit);
    			}
    		}
    		catch(SQLException e) {
    			throw new DAOException(e);
    		}  
    		return produit;
    	}  
    }
    Notez que ce code est toujours fonctionnel, indépendamment de la BDD. On passe sous Oracle, ça marche encore. On peut même envisager des Tests avec une autre BDD, comme H2.

    Après, on passe au contrôleur.
    Là, sans un framework de Haut Niveau, on fait une simple Servlet.
    Le rôle du contrôleur est de prendre une requête HTTP, la traiter, et envoyer la réponse. On est ici en web 1.0. On envoie comme réponse une page HTML.

    Pour le traitement, ce n'est pas le contrôleur qui le fait, mais il va déléguer.
    Il aura donc besoin de notre DAP (ProduitDAO) pour fonctionner.

    Avec un framework de Haut Niveau (Spring, CDI), on injecterait (par constructeur, de préférence), la DAO.

    Ici, on va juste la construire dans le constructeur.

    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    @WebServlet("/produits")
    public class ProduitControleur extends HttpServlet {
        private static final long serialVersionUID = 1L;
     
        private final ProduitDAO produitDAO;
     
       public ProduitControleur(){
         produitDAO = new ProduitDAO(new ConfigurationMySQL();
      }
     
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         try{
            List<Produit> produits = produitDAO.getListeProduit();
     
            request.setAttribute("produits", produits))
     
            RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/produits.jsp");
            dispatcher.forward(request, response);
         }catch(DAOException e){
             throw new ServletException(e);
         }
      }
    }
    Dans le contrôleur/servlet, on récupère les produits, on les set dans la requêtes, et on dit de charger la JSP.

    Pour la JSP, je n'ai rien à dire. Manque peut-être:
    request.getParameter("produits");

    Après, ici, on utilise JSTL, et là, j'ai vraiment oublié.

    Bonus:
    https://www.baeldung.com/mvc-servlet-jsp

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 205
    Points : 102
    Points
    102
    Par défaut
    Bonjour PhilippeGibault, merci pour ton post.
    Je ne l'ai peut être pas dis mais je suis nouveau dans la programmation java et POO et mon projet s'inscrit dans un cadre académique ce qui m'oblige à rester dans une certaine mesure dans un canevas.
    Avec Try-With_Ressources, je n'ai aucun problème, je ferme mes ressources ouvertes mais il me faut bien comprendre les classes pour la connexion à la BDD (copier/coller ne me serait d'aucune utilité).

    J'ai une question, au niveau de la JSP, pourquoi utiliser un doPost en lieu et place de doGet alors qu'on affiche que les données provenant de la base de données ?

    Ma problème n'est toujours pas résolu, pourquoi les données ne s'affichent avec un forEach mais d'affiche avec while(next) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <c:forEach var="p" items="${produits}">
    			<tr>
    				<td><c:out value="${p.getDesignation}" /></td>
    				<td><c:out value="${p.getPrix}" /></td>
    				<td><c:out value="${p.getPoids}" /></td>
    				<td><c:out value="${p.getDatePeremption}" /></td>
    			</tr>	
    		</c:forEach>
    Le warning sur mon forEach peut-il être à l'origine ?
    A problem was encountered using TagExtraInfo class org.apache.taglibs.standard.tei.ForEachTEI for 'c:forEach'

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu peux essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <td>${p.getDesignation()}</td>
    <td>${p.getPrix()}</td>
    <td>${p.getPoids()}</td>
    <td>${p.getDatePeremption()}</td>
    ou alors ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <td>${p.designation}</td>
    <td>${p.prix}</td>
    <td>${p.poids}</td>
    <td>${p.datePeremption}</td>

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 205
    Points : 102
    Points
    102
    Par défaut
    Bonjour OButterlin,
    J'ai essayé avec les attributs sans succès.

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Comme dit, je ne pratique plus depuis longtemps les JSP, du coup, je suis un peu court là.

    Question bête : tu as défini où ta variable produits ?
    Si les données viennent d'un contrôleur, il faut placer la liste d'objets ProduitBean dans un scope (request ou session) pour que la page jsp (et donc le forEach) puisse y avoir accès.

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/10/2014, 10h53
  2. Affichage des donnée de BD dans une page JSP
    Par sigway dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 13/10/2012, 21h49
  3. [MySQL] Problème d'affichage des données!
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/09/2006, 16h43
  4. Problème d'affichage de données avec crystal report
    Par napegadie dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 07/12/2005, 16h45
  5. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo