обновить список значений в текстовом поле в struts2

#struts2 #iterator

#struts2 #итератор

Вопрос:

Я столкнулся с проблемой в Struts2, в моем примере приложения у меня есть массив объектов (скажем, имя пользователя), мне нужно отобразить эти имена в виде редактируемых текстовых полей, для этого я использую итераторы, я успешно выполняю diaply, но когда я могу изменить то же значение и отправить форму. Я получаю весь массив, который содержит нулевое значение.

Скажем, для примера в моем компоненте формы у меня есть имя свойства [] имена;

В моем JSP у меня есть итератор как

Если есть 3 имени, я могу получить эти имена в пользовательском интерфейсе, если смогу инициализировать их некоторым фиктивным значением, но когда я редактирую и суммирую, массив «имена» не обновляется. Пожалуйста, помогите мне в этом отношении

Ответ №1:

В Struts2, когда вам нужно повторно заполнить список элементов компонента, вам нужно ссылаться на них через индексы. Пожалуйста, обратитесь к примеру ниже:

Класс компонента:

 public class Person {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  

Класс действия:

 public class PersonAction extends ActionSupport {
    private List<Person> persons;

    public List<Person> getPersons() {
        return persons;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }

    //Initial Load method
    @Override
    public String execute() {
        persons = new ArrayList<Person>();

        int alpha = 65;
        for(int i = 0; i < 3 ; i  ) {
            Person person = new Person();
            person.setId(i);
            person.setName(String.valueOf((char)alpha  ));
            persons.add(person);
        }
        return SUCCESS;
    }

    //Function that handles the form submit
    public String updatePerson() {

        for(Person person : persons) {
            System.out.println(person.getId()   ":"   person.getName());
        }

        return SUCCESS;
    }
}
  

Страница:

 <s:form action="doUpdate">
         <s:iterator value="persons" status="stat" var="person">
              <s:textfield value="%{#person.name}" name="persons[%{#stat.count}].name"/><br/>
         </s:iterator>
         <s:submit value="Submit"/>
</s:form>
  

Когда вы отправляете приведенную выше форму, URL-адрес будет выглядеть doUpdate?persons[0].name=A1amp;persons[1].name=B1amp;persons[2].name=C1 следующим образом . Аналогично, если вам нужно обновить идентификатор объекта первого лица, вы добавите persons[0].id=3 его к URL-адресу с помощью формы. В <s:textfield value="%{#person.name}" name="persons[%{#stat.count}].name"/> , вы указываете, что предопределенным значением является имя пользователя для каждого объекта. name Атрибут предназначен для установки отображаемого элемента ввода html; имя, на которое будет ссылаться URL-адрес при отправке формы. Вы получите четкое представление, если посмотрите на сгенерированный html.

Комментарии:

1. спасибо за ваш ответ. это работает для меня. В моем случае это немного сложнее. У меня просто есть другой список в объекте person, он называется state . как показано ниже:

2. состояние открытого класса { private int id; private String stateAbbr; … установщик, получатель .. страница ниже <s:form action=»doUpdate»> <s: значение итератора=»persons» статус =»stat» var=»person»>stat.count-1}].name» /> <s: значение итератора=»%{#person.states}» status=»stateStatus» var=»PersonState»>#stateStatus.count-1}].stateAbbr» label=»Abbr State» /> </s:итератор> </s: итератор> </s:отправить значение =»Отправить» /> </s: форма> состояния в Person равно нулю? что-то не так с моей страницей?

3. Смотрите, когда вы отправляете форму, состояния[%{#stateStatus.count-1}].stateAbbr должен соответствовать какому-то человеку. В противном случае это бесполезно. Следовательно, внесите это изменение: <s:значение текстового поля=»%{#PersonState.stateAbbr}» name=»лица[%{#stat.count-1}].состояния[%{#stateStatus.count-1}].stateAbbr» label=»Состояние Abbr» />

4. Я думаю, что счетчик не должен использоваться в этом месте. Если вы хотите использовать count, мы должны использовать так. <s:значение текстового поля=»%{#person.name }» имя=»лица[%{#stat.count} — 1].имя»/>

Ответ №2:

Используйте тег итератора struts2, если список не пуст, затем используйте :

 <s:iterator value="names" status="namesStatus">
    <s:property/><br/>
</s:iterator>