[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:
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:
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:
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:
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:
if (index>=this.users.length) return "";
Si je les supprime, je vais receivoir toujours un erreur : out of bound :oops:
Je ne sais pas pouquoi ??
Vous pouvez m'aider ?
Merci d'avance
[Struts-Layout] Collection Input
Hi c_nvy
il ne marche pas encore
La code changée :
Code:
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 :evilred:
Code:
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) |
[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:
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:
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
http://lh4.ggpht.com/__bI2ZdFPQF8/ST...face_page1.JPG
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
http://lh4.ggpht.com/__bI2ZdFPQF8/ST...face_page2.JPG
Je ne sais pas pourqoui, vous avez qq idées ?
Merci d'avance!