Мы работаем со struts 2.0.14 и сталкиваемся с проблемой возврата индексированных свойств из JSP в класс действия.

Код выглядит примерно так.

  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>

Я мог бы успешно отображать значения на странице, но когда я отправляю форму, значения не заполняются. Я проверил firebug, чтобы увидеть, как публикуются параметры, и они такие: person ['0']. Name, person ['0']. Address.number и т. Д. Пожалуйста, дайте мне знать, в чем заключается ошибка.

2
Gopal 9 Янв 2010 в 10:54

2 ответа

Лучший ответ

Вы пробовали без 'вокруг% {# status.index}?

Как это:

<s:textfield name="person[%{#status.index}].name"/>
2
Nate 10 Янв 2010 в 04:32

Я заметил, что помимо удаления кавычек вокруг индекса, как предлагает Нейт , ваше поле называется persons, но вместо него в ваших параметрах используется person. Предполагая, что это опечатка, и это должно быть, например, persons[%{#status.index}].name, убедитесь, что:

  1. У вашего действия есть setPersons(List<Person> person), так что оно может создать новый список и установить его.
  2. Person и Address не имеют конструкторов без аргументов, поэтому их можно создавать автоматически "на лету".

Если он по-прежнему не работает, попробуйте добавить @Element (com.opensymphony.xwork2.util.Element) на persons, чтобы дать подсказку о том, каким типом объекта его заполнить:

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

Еще одна возможная вещь: один из суперклассов вашего действия может реализовать ParameterNameAware, который отфильтровывает параметры по имени. Быстрый способ проверить - переопределить acceptableParameterName в вашем действии и посмотреть, заставляет ли он его работать:

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

Дополнительные сведения см. В документации API для ParametersInterceptor: http://struts.apache.org/2.0.14/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ParametersInterceptor.html

2
ZoogieZork 10 Янв 2010 в 06:48