Hi Phil,

Just got a working example. Things for you to try out:

* the @ValidateNestedProperties({...}) belongs on the private
List<Person> people field, the getter method, or the setter method,
not on the event handler;

* make sure that you have a public no-args constructor, public
Person() {}, in the Person class;

* if nothing solves the problem, compare with my code below.

-- HomeActionBean.java --
public class HomeActionBean extends BaseActionBean {
  private List<Person> people;
  public List<Person> getPeople() {
    return people;
  }
  public void setPeople(List<Person> people) {
    this.people = people;
  }

  @DefaultHandler
  public Resolution index() {
    people = new ArrayList<Person>();
    people.add(new Person("name1", "email1"));
    people.add(new Person("name2", "email2"));
    return new ForwardResolution("/index.jsp");
  }

  public Resolution update() {
    System.out.println("people: " + people);
    return new ForwardResolution("/index.jsp");
  }
}

-- index.jsp --
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"; %>
<%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"; %>

<table>
<stripes:form beanclass="example.action.HomeActionBean" method="POST">
  <c:forEach items="${actionBean.people}" var="person" varStatus="loop">
    <tr>
      <td><stripes:text name="people[${loop.index}].name"
value="${person.name}"/></td>
      <td><stripes:text name="people[${loop.index}].email"
value="${person.email}"/></td>
    </tr>
    <c:set var="newIndex" value="${loop.index + 1}" scope="page"/>
  </c:forEach>
  <tr>
    <td><stripes:submit name="update" value="update"/></td>
  </tr>
  
</stripes:form>
</table>

-- Person.java --
public class Person {
  public Person() { }
  public Person(String name, String email) { setName(name); setEmail(email); }
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  private String email;
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  @Override
  public String toString() {
    return name + " " + email;
  }
}

Let me know what you find.

Cheers,
Freddy

- 
- Sure thing Freddy, actionBean:
- 
-         private List<Person> people;
- 
-         //called in default 'view' handler method so intial form is
- populate with people data that   can be updated
-       public void prepareView(){
-               people = new ArrayList<Person>();
-               people.add(new Person("tom","t...@..."));
-               people.add(new Person("harry","ha...@..."));
-               people.add(new Person("adrian","adr...@..."));
-               people.add(new Person("julie","ju...@..."));
-               people.add(new Person("sue","s...@..."));
-       }
-       
-       private List<Person> people;
-       
-       @ValidateNestedProperties ({
-             @Validate(field="name", required=true, minlength=3,
- maxlength=15, on="update"),
-              @Validate(field="email", required=true
- ,mask="[\\w\\...@[\\w\\.]+\\.\\w+", on="update")
-          })
-       @HandlesEvent("update")
-       public Resolution updatePeople(){
-               logger.info("people updated :" + people);
-               return new RedirectResolution(WelcomeActionBean.class,"view");
-       }
-       
-       public List<Person> getPeople() {
-               return people;
-       }
- 
-       public void setPeople(List<Person> people) {
-               this.people = people;
-       }
- 
- JSP:
- 
- <stripes:form
beanclass="com.orangehome.ui.action.admintools.ExampleActionBean"
- method="POST">
-    <c:forEach items="${actionBean.people}" var="person"
varStatus="loop"-
-             <tr>
-                 <td><stripes:text name="people[${loop.index}].name"
- value="${person.name}"/></td>
-                 <td><stripes:text name="people[${loop.index}].email"
-   value="${person.email}"/></td>
-             </tr>
-             <c:set var="newIndex" value="${loop.index + 1}"
scope="page"/-
-   </c:forEach>
-   <stripes:submit name="update" value="update"/>
-   </stripes:form>
- 
- Stripes is falling over in PropertyExpressionEvaluation.java:652,
- looks like it's trying to instantiate a primitive (the index) :
- 
- Class clazz = convertToClass(node.getValueType(), node);
- 
-             if (clazz.isArray()) {
-                 return Array.newInstance(clazz.getComponentType(), 0);
-             }
-             else if (clazz.isEnum()) {
-                 return clazz.getEnumConstants()[0];
-             }
-             else if (clazz.isInterface() ) {
-                 return ReflectUtil.getInterfaceInstance(clazz);
-             }
-             else {
-                 return clazz.newInstance();
-             }
- 
- Cheers,
- Phil


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users

Reply via email to