#java #arrays #post #struts2 #forms
#java #массивы #Публикация #struts2 #формы
Вопрос:
Как мне ОПУБЛИКОВАТЬ массив пользовательских объектов в действии Struts 2 на Java?
Например, если у меня есть следующий объект Java:
public class Person {
private String name;
private String lastName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
И следующее действие:
public class SavePersons extends ActionSupport {
private List<Person> persons;
@Override
public String execute() throws Exception {
// Do something
return SUCCESS;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
Я хотел бы сделать что-то подобное в HTML-форме:
<html>
<body>
<form method="POST" action="http://postHere">
<input type="text" name="persons[0].name" value="Name1"/>
<input type="text" name="persons[0].lastName" value="LastName1"/>
<input type="text" name="persons[1].name" value="Name2"/>
<input type="text" name="persons[1].lastName" value="LastName2"/>
<input type="submit" />
</form>
</body>
</html>
Есть какие-нибудь советы?
Комментарии:
1. Кватернион ответил на ваш вопрос. И ваш вопрос связан с табличными входными данными Struts2
Ответ №1:
То, что у вас есть, выглядит неплохо. Для struts2 не имеет значения, публикуете ли вы или доходите до значений настройки.
Используя тот же класс SavePersons, за исключением того, что я добавил public List<Person> getPersons()
метод. Это необходимо для того, чтобы решение заработало.
И использовать, по сути, ту же форму, за исключением того, что я предпочитаю писать свои формы с использованием тегов s2, где это имеет смысл (что отталкивает некоторых людей от тегов формы, так это тема s2 по умолчанию, вы можете глобально установить для темы значение simple, атрибут label не будет работать, но теги пользовательского интерфейса будут работать так же, как вы ожидаете, что подобные html-элементы будут вести себя):
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Person Form</title>
</head>
<body>
<h1>Person Form</h1>
<s:form action="person-test" method="post">
<s:textfield name="persons[0].name" label="fName 1"/>
<s:textfield name="persons[0].lastName" label="lName 1"/>
<s:textfield name="persons[1].name" label="fName 2"/>
<s:textfield name="persons[1].lastName" label="lName 2"/>
<s:submit/>
</s:form>
</body>
</html>
Обратите внимание, что метод=»post» не нужен, он используется по умолчанию.
Вот страница, используемая для отображения данных формы.
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>List of People</h1>
<s:iterator value="persons">
<s:property value="name"/> <s:property value="lastName"/><br/>
</s:iterator>
</body>
</html>
И это сработало просто отлично.
Комментарии:
1. Спасибо за ответ. Проблема в моем случае заключается в том, что если я не объявляю средство получения «getPersons» (потому что я не хочу читать список позже), это не сработает, и список persons никогда не заполняется в POST.
2. Можете ли вы использовать итератор для создания формы?
3. @Quaternion: @Mark прав в отношении того факта, что
getPersons
средство получения является обязательным для того, чтобы ваше решение работало. На самом деле установщик не будет устанавливать persons, getter будет использоваться для получения списка persons, а затем все его элементы начнут заполняться. На самом деле, вчера я потратил более 4 часов (последний с 4 моими коллегами), пытаясь выяснить, почему это не сработало, ваш ответ «getPersons предназначен только для чтения …» ввел нас в заблуждение. Наконец, добавление этого средства получения решило проблему.4. @ahmehri Я не знаю, о чем я думал, при настройке коллекций нужны геттеры. Я удалю свой предыдущий комментарий на случай, если он кого-то введет в заблуждение.