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

Spring Web Java Discussion :

[Spring MVC] Remplissage d'un combo box depuis ma BD


Sujet :

Spring Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Par défaut [Spring MVC] Remplissage d'un combo box depuis ma BD
    Bonsoir,

    j ai une methode getAllDomaines qui me return le contenu de ma table, dans ma JSp je voudrai remplir un combo box dynamiquement. donc j ai mis ce controleur:
    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
    package code.web;
    
    import java.util.*;
    
    import code.service.IService;
    import code.tables.*;
    
    public class Formulaire  {
    	IService service;
    	public IService getService(){
    		return service;
    	}
    	public void setService(IService service){
    		this.service=service;
    	}
    
    	
    	private String[] optionsCombo;
    
    	public Formulaire() {
    		
    		this.setOptionsCombo(getOptions());
    		
    	} 
    	
    	
    	public String[] getOptionsCombo() {
    		return optionsCombo;
    	}
    
    	public void setOptionsCombo(String[] optionsCombo) {
    		this.optionsCombo = optionsCombo;
    	}
    
    		
    int taille=8,i=0;	
    	
    	public String[] getOptions() {
    		
    		List dom= (List) service.getAllDomaines();
    		/*Iterator jt = dom.iterator();
    	   	while (jt.hasNext()){
    	   		//taille=taille+1;
    	   	}*/
    		
    	   	String[] options = new String[taille];
    	   	String label="test";
    	  // 	Iterator jt1 = dom.iterator();
    		for(int i1=0;i1<taille;i1++){
    	   	//while (jt1.hasNext()){
    			//Domaines domaine = (Domaines) jt1.next() ;	
    			options[i1] = label+i1;
    			//i++;
    		}
    		return options;
    	}
    	
    	
    }
    et voila ma 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <%@ page language="java" pageEncoding="ISO-8859-1" contentType="text/html;charset=ISO-8859-1"%>
    <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
    <%@ page isELIgnored="false" %>
    <html>
      <head>
      	<title>Formulaire Spring : combo</title>
      </head>  
      <body>
      	<h3>Formulaire Spring : combo</h3>
        <hr>
        <form method="post">
          <table border="0">
          	<!-- Combo -->
            <tr>
              <td>Combo</td>
              <td>
          		<select name="combo">
          			<c:forEach items="${formulaire.optionsCombo}" var="optionCombo">
     
          						<option>${optionCombo}</option>
     
          			</c:forEach>
          		</select>
              </td>
            </tr>
          </table>
    			<hr>
    			<input type="submit" value="Envoyer"> 
        </form>
      </body>
    </html>
    Si j enlève le code en rouge j ai mon cobo quand j exécute ma JSP, mais qd je le met j ai le message 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    type Rapport d'exception
     
    message
     
    description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
     
    exception
     
    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.FatalBeanException: Could not instantiate class [code.web.Formulaire]; constructor threw exception; nested exception is java.lang.NullPointerException: null
    	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:406)
    	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:348)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
     
    cause mère
     
    org.springframework.beans.FatalBeanException: Could not instantiate class [code.web.Formulaire]; constructor threw exception; nested exception is java.lang.NullPointerException: null
    	org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:187)
    	org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    	org.springframework.web.servlet.mvc.BaseCommandController.createCommand(BaseCommandController.java:331)
    	org.springframework.web.servlet.mvc.AbstractFormController.formBackingObject(AbstractFormController.java:458)
    	org.springframework.web.servlet.mvc.AbstractFormController.getErrorsForNewForm(AbstractFormController.java:341)
    	org.springframework.web.servlet.mvc.AbstractFormController.showNewForm(AbstractFormController.java:322)
    	org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:262)
    	org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
    	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:723)
    	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:663)
    	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:394)
    	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:348)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    ce que j ai compris c que j arrive pas à récupérer service.getAllDomaines() sachant que j utilise cette methode ds d autre controlleur et elle me rend le resultat attendu.
    Est ce que quelqu un vois le prb merci
    Merci de votre aide

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Ta méthode getOptions() est appelée dans ton constructeur alors que l'injection de service n'est surement pas faite !
    Etant donné que tu as une dépendance forte, il est conseillé de faire une injection par le constructeur ainsi tu auras :

    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
    public class Formulaire  {
      IService service;
      ...
     
      public Formulaire(IService service) {
        if( service != null) {
          this.service = service;
          setOptionsCombo(getOptions());
        } else {
          throw new NullPointerException("blabla"); // ou autre exception de ton choix
        }
      }
     
      ...
    }
    Pense aussi à modifier l'injection dans ton fichier de configuration, passe par le constructeur et non par une propriété

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Par défaut
    merci pour votre reponse,
    mais j ai pas compris ce que vous voulez dir par:

    Pense aussi à modifier l'injection dans ton fichier de configuration, passe par le constructeur et non par une propriété

    voila mon fichier de conf:
    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
    <?xml version="1.0" encoding="ISO_8859-1"?>
    <!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    	<!-- la source de donnéees DBCP -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    		destroy-method="close">
    		<property name="driverClassName">
    			<value>com.mysql.jdbc.Driver</value>
    		</property>
    		<property name="url">
    			<value>jdbc:mysql://localhost/profil1</value>
    		</property>
    		<property name="username">
    			<value>root</value>
    		</property>
    		<property name="password">
    			<value>lotfi</value>
    		</property>
    	</bean>
     
    	<!-- SqlMapCllient -->
    	<bean id="sqlMapClient" 
    		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    		<property name="dataSource">
    			<ref local="dataSource"/>
    		</property>
    		<property name="configLocation">
    			<value>sql-map-config-mysql.xml</value>
    		</property>
    	</bean>
    	<!-- la classes d'accè à la couche [dao] -->
    	<bean id="dao" class="code.dao.DaoImplDomaine">
    		<property name="sqlMapClient">
    			<ref local="sqlMapClient"/>
    		</property>
    	</bean>
    	<!-- gestionnaire de transactions -->
    	<bean id="transactionManager" 
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource">
    			<ref local="dataSource"/>
    		</property>
    	</bean>
    	<!-- la classes d'accès à la couche [service] -->
    	<bean id="service" 
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager">
    			<ref local="transactionManager"/>
    		</property>
    		<property name="target">
    			<bean class="code.service.ServiceImpl">
    				<property name="dao">
    					<ref local="dao"/>
    				</property>
    			</bean>
    		</property>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="delete*">PROPAGATION_REQUIRED</prop>
    			</props>
    		</property>
    	</bean>
    </beans>

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    ...

    Spring permet 2 mode d'injection de dépendances :
    • par attibut
    • par constructeur


    Dans ton cas il est préférable de faire une injection par dépendance dans la configuration !

    Exemple par attribut "Setter Injection"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <bean id="monBean" class="package.MaClasse">
      <property name="propriete" value="valeur" />
    </bean>
    Exemple par constructeur "Constructor Injection"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <bean id="monBean" class="package.MaClasse">
      <constructor-arg>
        <value>valeur</value>
      </constructor-arg>
    </bean>
    Il est important de maitriser les bases de l'injection avant de s'attaquer à un projet au risque de plomber ton temp sur des problèmes très simple.
    Un conseil qui vaut de l'or: laisse tomber ton projet une demie journée et plonge toi dans la doc de Spring, uniquement la partie relative à l'injection de dépendance.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Par défaut
    j ai ajouter dans mon fichier de conf l injection de service par constructeur j ai mis 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
    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
    <?xml version="1.0" encoding="ISO_8859-1"?>
    <!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    	<!-- la source de donnéees DBCP -->
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    		destroy-method="close">
    		<property name="driverClassName">
    			<value>com.mysql.jdbc.Driver</value>
    		</property>
    		<property name="url">
    			<value>jdbc:mysql://localhost/profil1</value>
    		</property>
    		<property name="username">
    			<value>root</value>
    		</property>
    		<property name="password">
    			<value>lotfi</value>
    		</property>
    	</bean>
    	
    	<!-- SqlMapCllient -->
    	<bean id="sqlMapClient" 
    		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    		<property name="dataSource">
    			<ref local="dataSource"/>
    		</property>
    		<property name="configLocation">
    			<value>sql-map-config-mysql.xml</value>
    		</property>
    	</bean>
    	<!-- la classes d'accè à la couche [dao] -->
    	<bean id="dao" class="code.dao.DaoImplDomaine">
    		<property name="sqlMapClient">
    			<ref local="sqlMapClient"/>
    		</property>
    	</bean>
    	<!-- gestionnaire de transactions -->
    	<bean id="transactionManager" 
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource">
    			<ref local="dataSource"/>
    		</property>
    	</bean>
    	<!-- la classes d'accès à la couche [service] -->
    	<bean id="service" 
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager">
    			<ref local="transactionManager"/>
    		</property>
    		<property name="target">
    			<bean class="code.service.ServiceImpl">
    				<property name="dao">
    					<ref local="dao"/>
    				</property>
    			</bean>
    		</property>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="delete*">PROPAGATION_REQUIRED</prop>
    			</props>
    		</property>
    	</bean>
    
    <!-- injection du bean service par constructeur -->
    
        <bean id="Formulaire" class="code.web.Formulaire">
       <constructor-arg><ref local="service"/></constructor-arg>
      
    </bean>
    
    
    </beans>
    Et j ai modiffier mon controleur:
    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
    package code.web;
     
    import java.util.*;
     
    import code.service.IService;
    import code.tables.*;
     
    public class Formulaire  {
    	IService service;
    	public IService getService(){
    		return service;
    	}
    	public void setService(IService service){
    		this.service=service;
    	}
     
     
    	private String[] optionsCombo;
      public Formulaire(){
     
        }
     
    	public Formulaire(IService service) {
    		this.service=service;
    		this.setOptionsCombo(getOptions());
     
    	} 
     
     
    	public String[] getOptionsCombo() {
    		return optionsCombo;
    	}
     
    	public void setOptionsCombo(String[] optionsCombo) {
    		this.optionsCombo = optionsCombo;
    	}
     
     
    int taille=8,i=0;	
     
    	public String[] getOptions() {
     
    		List dom= (List) service.getAllDomaines();
    		taille=dom.size();
     
    	   	String[] options = new String[taille];
    	   	String label="test";
     
    		for(int i1=0;i1<taille;i1++){
     
    			options[i1] = label+i1;
    			System.out.print(options[i1]);
     
    		}
    		return options;
    	}
     
     
    }
    dans le log je vois que ma table option est remlis par (test0 test1 test2) mais qd j éxecute ma page j ai un combo vide , est ce que vous voyez pourquoi??

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    dans ton code jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <select name="combo">
       <c:forEach items="${formulaire.optionsCombo}" var="optionCombo">
        <option>${optionCombo}</option>
      </c:forEach>
    </select>
    d'où sort la référence formulaire ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Spring mvc (deux combo dépendant)
    Par santati dans le forum Spring Web
    Réponses: 0
    Dernier message: 28/05/2009, 15h20
  2. Réponses: 0
    Dernier message: 25/03/2009, 11h21
  3. Remplissage de plusieurs combo box
    Par lordgodgiven dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 31/08/2008, 00h00
  4. [Spring MVC] Remplissage d'un combo depuis un BD
    Par jamalmoundir dans le forum Spring Web
    Réponses: 15
    Dernier message: 12/07/2007, 15h13
  5. [Spring MVC] Renvoyer vers une vue depuis un intercepteur
    Par ChtiGeeX dans le forum Spring Web
    Réponses: 2
    Dernier message: 01/04/2007, 10h26

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