#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>