Могут ли Struts2 s:select получить список из косвенного объекта?

#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 a List<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, и он перешел в код! Теперь, где есть документация, в которой говорится, что эти списки могут использовать реальные вызовы методов? Большое вам спасибо!

3. Посмотреть полную страницу нажмите здесь