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

Struts 1 Java Discussion :

[Struts-Layout] Collection Input


Sujet :

Struts 1 Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [Struts-Layout] Collection Input
    j'ai qq codes sur layout framework, comme ça

    Ne faire pas attention aux chaînes de titles, c'est bonne.
    dans le fichier struts-config.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <action attribute="collectionInputForm"
    			input="/jsp/strutsLayout/Collection/collectionInput.jsp"
    			name="collectionInputForm" 
    			parameter="do"
    			path="/collectionInput" 
    			scope="request"
    			type="chapter2a.struts.action.CollectionInputAction">
    			<forward name="showCollection" path="display.layout.collection.input.form" />
    		</action>
    dans la 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    <layout:form 
    	action="collectionInput" styleClass="FORM" reqCode="save" 
    	key="struts.layout.collection.input.form.title">
    <layout:pager maxPageItems="4" sessionPagerId="collectionInputPageID">
    	<layout:collection name="collectionInputForm" property="users" id="user"
    		styleClass="FORM">
    		<layout:collectionItem property="id"
    			title="struts.layout.collection.user.id" />
    		<layout:collectionInput
    			formProperty="usrName" 
    			property="usrName" 
    			title="struts.layout.collection.user.username" />
    		<layout:collectionInput
    			formProperty="usrNickname"  
    			property="usrNickname"
    			title="struts.layout.collection.user.nickname" />
    		<layout:collectionItem property="infocity.infoCityName"
    			title="struts.layout.collection.user.city" />
    		<layout:collectionItem property="infointerest.infoInterestName"
    			title="struts.layout.collection.user.interest" />
    		<layout:collectionItem property="infoincomelevel.infoIncomeLevel"
    			title="struts.layout.collection.user.income" />
    	</layout:collection>
    </layout:pager>
    <layout:message key="_______________________________________________________________________"/>
     
    <layout:submit>
    	<layout:message key="struts.layout.collection.input.button.submit"/>
    </layout:submit>
    </layout:form>
    dans le fichier Form
    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
     
    public class CollectionInputForm extends ActionForm {
    	private User[] users = new User[0];
     
    	public void reset(ActionMapping mapping, HttpServletRequest request) {
    		users = new User[0];
    	}
     
    	public User[] getUsers() {
    		return users;
    	}
     
    	public void setUsers(User[] users) {
    		this.users = users;
    	}
     
    	/// for the collectionInput
     
    	public String getUsrName(int index) {
    		if (index>=this.users.length) return "";
    		return this.users[index].getUsrName();
    	}
     
    	public void setUsrName(int index, String usrName) {
    		if (index>=this.users.length) return;
    		this.users[index].setUsrName(usrName);
    	}
     
    	public String getUsrNickname(int index) {
    		if (index>=this.users.length) return "";
    		return this.users[index].getUsrNickname();
    	}
     
    	public void setUsrNickname(int index, String usrNickname) {
    		if (index>=this.users.length) return;
    		this.users[index].setUsrNickname(usrNickname);
    	}
    }
    et dans le fichier d'action
    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
     
    public class CollectionInputAction extends DispatchAction {
    	/*
    	 * Generated Methods
    	 */
     
     
    	public ActionForward showList(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) {
     
    		CollectionInputForm collectionInputForm = (CollectionInputForm) form;
     
    		DataBaseControler control = new DataBaseControler();
     
    		collectionInputForm.setUsers(control.getUserList());
     
    		return mapping.findForward("showCollection");
    	}
     
    	public ActionForward save(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) {
     
    		CollectionInputForm collectionInputForm = (CollectionInputForm) form;
     
    		DataBaseControler control = new DataBaseControler();
     
    		control.saveUsers(collectionInputForm.getUsers());
     
    		return mapping.findForward("showCollection");
    	}
    }
    Ma problème est quand je faire submit la page va affichier rien
    Faire attention à la code de formAction, même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (index>=this.users.length) return "";
    Si je les supprime, je vais receivoir toujours un erreur : out of bound
    Je ne sais pas pouquoi ??

    Vous pouvez m'aider ?

    Merci d'avance

  2. #2
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Je te conseille d'utiliser une List d'objets User plutôt qu'un tableau pour éviter d'avoir à initialiser le tableau à une longueur de zéro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private List users=new ArrayList() ;
    Et ensuite, code le getter indexé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public String getUsrName(int index)
    {
        while (index >= this.users.size())
        {
            this.users.add(new User());
        }
        return ((User) this.users.get(index)).getUsrName();
    }
    idem pour usrNickname.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [Struts-Layout] Collection Input
    Hi c_nvy
    il ne marche pas encore
    La code changée :
    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
     
    public class CollectionInputForm extends ActionForm {	
    	private static final long serialVersionUID = 1L;
     
    	private List<User> users = new ArrayList<User>();
     
    //	public void reset(ActionMapping mapping, HttpServletRequest request) {
    //		this.users = new ArrayList<User>();
    //	}
     
    	public User[] getAUsers() {
    		return this.users.toArray(new User[0]);
    	}
     
    	public void setUsers(User[] users) {
    		this.users = new ArrayList<User>();
    		for(User user : users) {
    			this.users.add(user);
    		}		
    	}
     
    	public List<User> getUsers() {
    		return users;
    	}
     
    	public void setUsers(List<User> users) {
    		this.users = users;
    	}	
    	/// for the collectionInput
     
    	public String getUsrName(int index) {
    		while (index >= this.users.size())
    	    {
    	        this.users.add(new User());
    	    }
    	    return ((User) this.users.get(index)).getUsrName();
    	}
     
    	public void setUsrName(int index, String usrName) {
    		this.users.get(index).setUsrName(usrName);		
    	}
     
    	public String getUsrNickname(int index) {
    		while (index >= this.users.size())
    	    {
    	        this.users.add(new User());
    	    }
    	    return ((User) this.users.get(index)).getUsrNickname();
    	}
     
    	public void setUsrNickname(int index, String usrNickname) {
    		this.users.get(index).setUsrNickname(usrNickname);
    	}
    }
    Voici est l'erreur
    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
     
    type Exception report
     
    message
     
    description The server encountered an internal error () that prevented it from fulfilling this request.
     
    exception
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:469)
    	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:818)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:194)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
     
    root cause
     
    java.lang.reflect.InvocationTargetException
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	java.lang.reflect.Method.invoke(Unknown Source)
    	org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1773)
    	org.apache.commons.beanutils.PropertyUtilsBean.setIndexedProperty(PropertyUtilsBean.java:1391)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1016)
    	org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
    	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:818)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:194)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
     
    root cause
     
    java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
    	java.util.ArrayList.RangeCheck(Unknown Source)
    	java.util.ArrayList.get(Unknown Source)
    	chapter2a.struts.form.CollectionInputForm.setUsrNickname(CollectionInputForm.java:73)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	java.lang.reflect.Method.invoke(Unknown Source)
    	org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1773)
    	org.apache.commons.beanutils.PropertyUtilsBean.setIndexedProperty(PropertyUtilsBean.java:1391)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1016)
    	org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
    	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:818)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:194)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

  4. #4
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Il faudrait enlever le getter et setter qui utilise User[] ou alors, si tu en as besoin dans ton Action, les nommer différemment.

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [Struts-Layout] Collection Input
    Merci c_nvy beaucoup, il marche maintenant
    J'ajoute une idée, si j'efface la code dans la function reset, il marche bien mais si j'active cette code, il est erreur (même erreurs).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void reset(ActionMapping mapping, HttpServletRequest request) {
    		//this.users = new ArrayList<User>();
    	}
    J'ai autre problème encore, c'est le problème sur l'interface!
    Voir les images ci-dessous, s'il vous plaît

    Les codes finales de Form
    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
     
    public class CollectionInputForm extends ActionForm {	
    	private static final long serialVersionUID = 1L;
     
    	private List<User> users = new ArrayList<User>();
     
    	public void reset(ActionMapping mapping, HttpServletRequest request) {
    		//this.users = new ArrayList<User>();
    	}
     
    	public User[] getAUsers() {
    		return this.users.toArray(new User[0]);
    	}
     
    	public void setAUsers(User[] users) {
    		this.users = new ArrayList<User>();
    		for(User user : users) {
    			this.users.add(user);
    		}
    	}
     
    	public List<User> getUsers() {
    		return users;
    	}
     
    	public void setUsers(List<User> users) {
    		this.users = users;
    	}
    	/// for the collectionInput
     
    	public String getUsrName(int index) {
    		while (index >= this.users.size())
    	    {
    	        this.users.add(new User());
    	    }
    	    return ((User) this.users.get(index)).getUsrName();
    	}
     
    	public void setUsrName(int index, String usrName) {
    		this.users.get(index).setUsrName(usrName);		
    	}
     
    	public String getUsrNickname(int index) {
    		while (index >= this.users.size())
    	    {
    	        this.users.add(new User());
    	    }
    	    return ((User) this.users.get(index)).getUsrNickname();
    	}
     
    	public void setUsrNickname(int index, String usrNickname) {
    		this.users.get(index).setUsrNickname(usrNickname);
    	}
    }
    Le problème sur l'interface
    Quand je choisis la première page, la donnée est affichiée bien

    Mais quand je choisis la deuxième page, elle sont faux, la donnée sur l'interface ne change pas, si vous faissez attention à trois dernières colonnes, la donnée change bien

    Je ne sais pas pourqoui, vous avez qq idées ?

    Merci d'avance!

  6. #6
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Il ne faut pas réinitialiser la List dans la méthode reset de l'ActionForm parce que sinon, à chaque soumission du formulaire, la List aura une taille égale à zero, ce qui provoquera une erreur "IndexOutOfBoundException".

    Sinon, les captures d'écran ne sont pas visibles.

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

Discussions similaires

  1. [Struts:Layout] collection de checkbox
    Par Roievil dans le forum Struts 1
    Réponses: 10
    Dernier message: 26/01/2009, 17h50
  2. Réponses: 10
    Dernier message: 05/06/2007, 17h53
  3. [Struts-Layout] collection et checkbox
    Par khayri dans le forum Struts 1
    Réponses: 14
    Dernier message: 03/05/2007, 13h19
  4. Réponses: 1
    Dernier message: 20/12/2006, 23h14
  5. Réponses: 2
    Dernier message: 10/11/2006, 15h23

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