tags:

views:

553

answers:

3

Hi,

We are working with struts 2.0.14 and facing problem setting back indexed properties from JSP to action class.

Code looks similar to this.

  public class MyExample extends ActionSupport
        {

            private List<Person> persons;
            private List<String> names;

            public String execute()
            {
                //persons = myDAO.readPersons(names);
                return SUCCESS;
            }

            public String update()
            {
                for (Person p : persons)
                {
                    System.out.println(p.getName() + "---" + p.getAddress().getStreet());
                }
                return SUCCESS;
            }

            // Getters and setters     
        }

        class Person
        {
            private Address address;
            private String name;
             // Getters and setters    
        }

        class Address
        {
            private String street;
            private String number;   
             // Getters and setters    
        }

   And JSP:
       <%@ taglib prefix="s" uri="/struts-tags"%>
       <%@ page language="java" pageEncoding="ISO-8859-1"%>
       <!---- Other code ---->
       <s:ieterate value="persons" status="status">
        <tr>
          <s:textfield name="person['%{#status.index}'].name"/>
          <s:textfield name="person['%{#status.index}'].address.number"/>
           <s:textfield name="person['%{#status.index}'].street"/>
        </tr>

I could successfully display values onto the page, but when i submit the form the values are not getting populated. I checked firebug to see how the parameters are posted and they are like person['0'].name, person['0'].address.number etc., Please let me know where the mistake lies.

A: 

Did you try without the ' around the %{#status.index}?

Like this:

<s:textfield name="person[%{#status.index}].name"/>
Nate
+1  A: 

In addition to removing the quotes around the index as Nate suggests, I noticed that your field is named persons but your parameters use person instead. Assuming that's a typo and it should be, for instance, persons[%{#status.index}].name, make sure:

  1. Your action has a setPersons(List<Person> person) so that it can create a new list and set it.
  2. Person and Address have no-arg constructors so that they can be automatically created on the fly.

If it's still not working, try adding the @Element (com.opensymphony.xwork2.util.Element) to persons to give it a hint about what type of object to fill it with:

@Element(value=Person)
List<Person> persons;

One other thing that might be happening is one of the superclasses of your action may implement ParameterNameAware which filters out parameters by name. A quick way to check is to override acceptableParameterName in your action and see if it makes it work:

@Override
public boolean acceptableParameterName(String name) {
    return true;
}

See the API docs for ParametersInterceptor for more details: http://struts.apache.org/2.0.14/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ParametersInterceptor.html

ZoogieZork
A: 

Person and Address have no-arg constructors so that they can be automatically created on the fly.