#forms #list #struts2
#формы #Список #распорки 2
Вопрос:
У меня есть список выбора struts2, и я бы хотел, чтобы список исходил из ‘вложенного’ объекта, таким же образом, как ‘имя’ может быть присвоено ‘вложенному’ объекту. Этот код работает :
<s:select name="person.town" id="ddlTown" list="towns"/>
Мой объект формы имеет атрибут объекта ‘person’ и атрибут списка ‘towns’. Итак, когда отображается форма, form.getTowns() вызывается для заполнения списка выбора, а когда форма отправлена, форма создает экземпляр объекта Person, а затем вызывает Person.setTown() для установки значения.
Я хочу что-то вроде этого :
<s:select name="person.town" id="ddlTown" list="listholder.towns"/>
Чтобы при отображении формы вызывался form.getListholder().getTowns() для заполнения списка выбора. Но я получаю ошибку :
The requested list key 'listholder.towns' could not be resolved as a collection/array/map...
Есть ли какой-либо способ сделать это так, чтобы мой объект формы не содержал напрямую все мои объекты списка?
* РЕДАКТИРОВАТЬ *
Андреа Лигиос и другие: Извините за путаницу. Да, form означает «действие», я назвал его «form», потому что, поскольку тег
<s:form action="addperson_act" method="post" id="addperson_form" name="addperson_form"
но на самом деле это объект mypkg.addPersonAct. В этой форме более 10 выпадающих списков, поэтому у меня есть
class mypkg.AddPersonAct {
List<String> towns;
List<String> states;
List<String> countys;
List<String> countrys;
. . .
и т.д. Со всеми получателями / установщиками. Проблема в том, что эти более чем 10 списков (и болеечем 20 способов получения / установки) дублируются в 2 других объектах action / form из-за того, как структурировано это приложение, поэтому оно запутанное и требует больше работы для внесения изменений. Что я хочу сделать, так это иметь объект, который содержит все эти списки :
class AddPersonLists {
List<String> towns;
List<String> states;
List<String> countys;
List<String> countrys;
. . .
со всеми получателями / установщиками. Таким образом, для 3 объектов action / form требуется только ОДИН атрибут и средство получения :
class mypkg.AddPersonAct {
private AddPersonList listHolder;
public getListHolder {
return listHolder;
}
Итак, эти списки, способы их создания и методы получения / установки содержатся в ОДНОМ объекте, а не дублируются в 3.
К вашему сведению: я раньше не занимался веб-разработкой и унаследовал этот код и способ его структурирования. Наличие 3 объектов Action со всеми одинаковыми атрибутами кажется неправильным, но у меня нет времени на переработку / реструктуризацию способа работы этого приложения.
Комментарии:
1. Неясно, какие объекты списка вы хотите, чтобы ваш объект формы не обязательно содержал все ваши объекты списка .
2. О каком объекте form вы говорите?
3. Покажите свой код, это очень сбивает с толку. Форма означает действие? является ли
listholder
aList<Holder>
, гдеHolder
находится объект, содержащий атрибут,towns
который являетсяList<Town>
?4. Как вы заполняете свои списки?
5. Списки заполняются из запросов к базе данных.
Ответ №1:
Вы можете сделать это следующим образом
В действии у вас есть AddPersonAct.java
public class AddPersonAct {
private AddPersonLists listHolder;
public void setListHolder(AddPersonLists listHolder) {
this.listHolder = listHolder;
}
public AddPersonLists getListHolder() {
return listHolder;
}
}
В классе Action
private AddPersonAct addpersonact;
//getter
//setter
В jsp
<s:select name="person.town" id="ddlTown" list="addpersonact.getListHolder().getTowns()"/>
Комментарии:
1. Вау — это работает!! list=»addpersonact.getListHolder().getTowns() — Мне даже удалось передать параметр, используя #session.XXX, и он перешел в код!
2. list=»addpersonact.getListHolder().getTowns() — Мне даже удалось передать параметр, используя #session.XXX, и он перешел в код! Теперь, где есть документация, в которой говорится, что эти списки могут использовать реальные вызовы методов? Большое вам спасибо!