Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заполучить данные из <select> ? Получение данных в командный объект 
:(
    Опции темы
Dreamtraveler
Дата 11.12.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Здравствуйте.
У меня возник вопрос, заключается он в следующем:
Как мне получить данные в командный объект (Spring) из Drop-dawn List т.е. <select><option> и т.д. ?
Вот из просто строки input они берутся как value = ${status.value} 
И еще вопрос. Когда описывается контроллер (модель MVC) SimpleFormController  есть поля команд класс и команд нейм, как мне задать несколько командных классов и имен соответственно. Это реально вообще? Просто если на странице данные относящиеся к разным командным объектам как быть?
Заранее благодарю!
PM MAIL   Вверх
Akeem
Дата 12.12.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

Репутация: нет
Всего: 3



В Struts 1* это делается довольно просто. Пишется свой клас формы MyForm extends ActionForm где String  nameofmyselector имя селестора и сюда же запишется твой выбранный option
И в конфиге прописываешь мапинг на твою форму вместо SimpleActionForm 

Код


<form name="myform" type="org.exm.MyForm">




PS немного что-то не в тему. Ну принцип я думаю тот же. 

Это сообщение отредактировал(а) Akeem - 12.12.2009, 20:16


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
Egik2
Дата 12.12.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 29.7.2008
Где: Агудзера

Репутация: 2
Всего: 11



Мне кажется что здесь дело даже не в Spring, а в общем принципе передачи параметров от форм.
Вы должны просто в теге <select> назначить имя, например:
Код

<select name="hello">
            <option value="1">1 значение</option>
            <option value="2">2 значение</option>
            <option value="3">3 значение</option>
</select>


После этого использовать то же самое:
value = ${hello.value} 
и оно будет равнятся значению option-value, который был выбран


--------------------
Три великие добродетели программиста: лень, нетерпение и самомнение (Larry Wall)
a-nav.com
developer-blog.ru
world-poetry.org
PM MAIL WWW ICQ   Вверх
sergioK
Дата 13.12.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(Egik2 @ 12.12.2009,  22:28)
Мне кажется что здесь дело даже не в Spring, а в общем принципе передачи параметров от форм.
Вы должны просто в теге <select> назначить имя, например:
Код

<select name="hello">
            <option value="1">1 значение</option>
            <option value="2">2 значение</option>
            <option value="3">3 значение</option>
</select>


После этого использовать то же самое:
value = ${hello.value} 
и оно будет равнятся значению option-value, который был выбран

это как водить машину за столом  smile  можно код класса в студию , что такое value ? arrayList ? Map? просто массив? 
  значением в обычном jsp это не проблема , здесь же фраймворк это делает за меня 
поэтому нужно один раз посмотреть пример , общие рассуждения тут не нужны  smile 
PM MAIL   Вверх
garbuz
Дата 13.12.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



http://www.htmlbook.ru/html/select.html
По теме

Код

<td><form:select path="status">
                        <form:options items="${statuses}" itemValue="statusId" itemLabel="alias"/>
                    </form:select>


Не ленитесь смотреть в документацию. Там все есть.
PM MAIL   Вверх
sergioK
Дата 13.12.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(garbuz @ 13.12.2009,  12:10)
http://www.htmlbook.ru/html/select.html
По теме

Код

<td><form:select path="status">
                        <form:options items="${statuses}" itemValue="statusId" itemLabel="alias"/>
                    </form:select>


Не ленитесь смотреть в документацию. Там все есть.

http://static.springsource.org/spring/docs...aglib-selecttag

там то же самое что у вас 
 <tr>
      <td>Skills:</td>
      <td><form:select path="skills" items="${skills}"/></td>
  </tr>


а вот что такое skills не понятно по логике должен быть Map или array ,
но примера класа там нет может и есть но я не нашел или есть какая то еще документация ? 
если вы это делали так сбосьте пример класса ,  

если бы все было просто и понятно в докуметации то форум был бы не нужен  smile .

PM MAIL   Вверх
garbuz
Дата 13.12.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(sergioK @  13.12.2009,  13:38 Найти цитируемый пост)
там то же самое что у вас 
 <tr>
      <td>Skills:</td>
      <td><form:select path="skills" items="${skills}"/></td>
  </tr>


а вот что такое skills не понятно по логике должен быть Map или array ,
но примера класа там нет может и есть но я не нашел или есть какая то еще документация ? 
если вы это делали так сбосьте пример класса ,  

если бы все было просто и понятно в докуметации то форум был бы не нужен  smile .


Наверняка в вашем случае skills это коллекция, которая входит в состав commandObject, тогда сам комбобокс на странице должен быть multiple. Чтобы забиндить на объект коллекцию, значения которой вы выбираете из листа, вам надо использовать кастомный биндер.
В случае с коллецией я делал так. В класс контроллера вставляем
Код

binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class) {


            protected Object convertElement(Object element) {
                if (element != null) {
                    Long skillId = Long.parseLong(element.toString());
                    Skill skill = skillService.getById(skillId );
                    return skill;

                }
                return null;
            }

        });


Это в случае с коллекцией. Могут понадобиться еще методы getAsText() и setAsText();


Это сообщение отредактировал(а) garbuz - 13.12.2009, 14:06
PM MAIL   Вверх
sergioK
Дата 13.12.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(garbuz @ 13.12.2009,  14:06)
Цитата(sergioK @  13.12.2009,  13:38 Найти цитируемый пост)
там то же самое что у вас 
 <tr>
      <td>Skills:</td>
      <td><form:select path="skills" items="${skills}"/></td>
  </tr>


а вот что такое skills не понятно по логике должен быть Map или array ,
но примера класа там нет может и есть но я не нашел или есть какая то еще документация ? 
если вы это делали так сбосьте пример класса ,  

если бы все было просто и понятно в докуметации то форум был бы не нужен  smile .


Наверняка в вашем случае skills это коллекция, которая входит в состав commandObject, тогда сам комбобокс на странице должен быть multiple. Чтобы забиндить на объект коллекцию, значения которой вы выбираете из листа, вам надо использовать кастомный биндер.
В случае с коллецией я делал так. В класс контроллера вставляем
Код

binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class) {


            protected Object convertElement(Object element) {
                if (element != null) {
                    Long skillId = Long.parseLong(element.toString());
                    Skill skill = skillService.getById(skillId );
                    return skill;

                }
                return null;
            }

        });


Это в случае с коллекцией. Могут понадобиться еще методы getAsText() и setAsText();

cоmbo не может быть не колекцией тоесь может но это извращение  smile 

непонятны две вещи 
1) как получить binder и почему в примерах обходяться без него ?
2) где код класса заполняющего данные? , прошу уже 4 раз  smile 
PM MAIL   Вверх
garbuz
Дата 13.12.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



sergioK, то что пишет референс официальный - это лишь небольшая часть от спринга.
Вот еще раз биндер
Код

Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        
       

        binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class) {
            protected Object convertElement(Object element) {
                if (element != null) {
                    Long skillId = Long.parseLong(element.toString());
                    Skill skill = skillService.getById(skillId );
                    return skill;
                }
                return null;
            }
        });

      
    }

Можете этот метод вставлять прямо в контроллер. 

Для заполнения обджекта данными не нужен никакой доп класс, пользуйтесь биндигом. Можно посмотреть в пакет org.springframework.beans.propertyeditors, там много различных раелизаций. В том числе и со временем и датой, у многих на этот счет возникают вопросы.
PM MAIL   Вверх
sergioK
Дата 14.12.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(garbuz @ 13.12.2009,  14:06)
Цитата(sergioK @  13.12.2009,  13:38 Найти цитируемый пост)
там то же самое что у вас 
 <tr>
      <td>Skills:</td>
      <td><form:select path="skills" items="${skills}"/></td>
  </tr>


а вот что такое skills не понятно по логике должен быть Map или array ,
но примера класа там нет может и есть но я не нашел или есть какая то еще документация ? 
если вы это делали так сбосьте пример класса ,  

если бы все было просто и понятно в докуметации то форум был бы не нужен  smile .


Наверняка в вашем случае skills это коллекция, которая входит в состав commandObject, тогда сам комбобокс на странице должен быть multiple. Чтобы забиндить на объект коллекцию, значения которой вы выбираете из листа, вам надо использовать кастомный биндер.
В случае с коллецией я делал так. В класс контроллера вставляем
Код

binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class) {


            protected Object convertElement(Object element) {
                if (element != null) {
                    Long skillId = Long.parseLong(element.toString());
                    Skill skill = skillService.getById(skillId );
                    return skill;

                }
                return null;
            }

        });


Это в случае с коллекцией. Могут понадобиться еще методы getAsText() и setAsText();

так есть еще спринг неофициальный что-ли? smile  и где о нем можно почитать ?
 что в вашем примере находиться в переменной  element? 
  что из себя представляет класс skill и класс skillService? 

 
PM MAIL   Вверх
garbuz
Дата 14.12.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(sergioK @  14.12.2009,  00:03 Найти цитируемый пост)
так есть еще спринг неофициальный что-ли? smile  и где о нем можно почитать ?

Еще какой официальный. Читайте на сайте, в книгах и на форумах.

Цитата(sergioK @  14.12.2009,  00:03 Найти цитируемый пост)
что в вашем примере находиться в переменной  element? 

element в данном случае - это значение, полученное из селекта на странице, получаем id, получаем сам объект и отдаем его далше на обработку\биндинг.


Цитата(sergioK @  14.12.2009,  00:03 Найти цитируемый пост)
 что из себя представляет класс skill и класс skillService? 

skill - объект некого класса Skill, не важно какого. skillService - соответственно сервис, работающий с данным классом, предоставляющий дао методы. Взял из вашего примера выше.




sergioK, постарайтесь разобраться, а то не чувствуется упорства. Все получится.  smile 
PM MAIL   Вверх
sergioK
Дата 27.12.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(garbuz @ 13.12.2009,  19:38)
sergioK, то что пишет референс официальный - это лишь небольшая часть от спринга.
Вот еще раз биндер
Код

Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        
       

        binder.registerCustomEditor(Set.class, "skills", new CustomCollectionEditor(Set.class) {
            protected Object convertElement(Object element) {
                if (element != null) {
                    Long skillId = Long.parseLong(element.toString());
                    Skill skill = skillService.getById(skillId );
                    return skill;
                }
                return null;
            }
        });

      
    }

Можете этот метод вставлять прямо в контроллер. 

Для заполнения обджекта данными не нужен никакой доп класс, пользуйтесь биндигом. Можно посмотреть в пакет org.springframework.beans.propertyeditors, там много различных раелизаций. В том числе и со временем и датой, у многих на этот счет возникают вопросы.

мой класс выглядит так 
[code=nocolor]
package springapp.service;

import java.util.HashMap;
import java.util.Map;

public class Currency<E> {
 /**
     * 
     */
    private static final long serialVersionUID = 1L;
private String details;
 private String country="USA";
 private String currency;
 private String baseCurrency="USD";
 private double rate;
 private Map<String, Double> list = new HashMap<String, Double>();
 private String rates[]={"USD/EUR","USD/GRP"};

 
public Map<String, Double> getList() {
    
    return list;
}
public void setList(Map<String, Double> list) {
    this.list = list;
}
// cacheable result set 
 public double getRate() {
    return rate;
}
 public Currency(){
     init();
 }

 public void  init(){    
        list.put("USD/EUR", 1.48);
        list.put("USD/GRP", 0.6);
        list.put("USD/CAD", 1.15);
        list.put("USD/JPY", 85.90);
        list.put("USD/AU", 1.50);
    
 }
public void setRate(double rate) {
    this.rate = rate;
}
public void setDetails(String details) {
    this.details = details;
}
public String getDetails() {
    return details;
}
public void setCountry(String country) {
    this.country = country;
}
public String getCountry() {
    return country;
}
public void setCurrency(String currency) {
    this.currency = currency;
}
public String getCurrency() {
    return currency;
}
public void setBaseCurrency(String baseCurrency) {
    this.baseCurrency = baseCurrency;
}
public String getBaseCurrency() {
    return baseCurrency;
}
public void setRates(String rates[]) {
    this.rates = rates;
}
public String[] getRates() {
    return rates;
}

}
 /code]



биндер не работает что я должен прописать в строке    binder.registerCustomEditor (), пробовал сделать класс как ехtеnd ArrayList не помогает 
Я заполняю данные через referenceData , formBackingObject 
что мне даст работа c  биндером ? 
PM MAIL   Вверх
garbuz
Дата 29.12.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(sergioK @  27.12.2009,  08:16 Найти цитируемый пост)
индер не работает что я должен прописать в строке    binder.registerCustomEditor (), пробовал сделать класс как ехtеnd ArrayList не помогает 
Я заполняю данные через referenceData , formBackingObject 
что мне даст работа c  биндером ?  

Класс Currency, это тот класс комманд-обджекта? Именно его вы создаете или нет? С чем возникают проблемы? С биндингом map или чего-то другого? Подробнее опишите.
PM MAIL   Вверх
sergioK
Дата 29.12.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(garbuz @ 29.12.2009,  14:25)
Цитата(sergioK @  27.12.2009,  08:16 Найти цитируемый пост)
индер не работает что я должен прописать в строке    binder.registerCustomEditor (), пробовал сделать класс как ехtеnd ArrayList не помогает 
Я заполняю данные через referenceData , formBackingObject 
что мне даст работа c  биндером ?  

Класс Currency, это тот класс комманд-обджекта? Именно его вы создаете или нет? С чем возникают проблемы? С биндингом map или чего-то другого? Подробнее опишите.

ну да Curency это класс в котором собираються (создаються ) данные 
методе referenceData(HttpServletRequest request, Object command,Errors errors) 
я прописываю    Currency<Object> currency= (Currency<Object>) command; и получаю к нему доступ тут все нормально ,
 выбранный в комбо боксе элемент получаю при помощи request.getParameter("list")  , где list это мар внутри класса Сurrency 
 тут вопщем проблемы нет 

тоже самое Я хочу проверить через initBinder зарегистрировав биндер , и обработать все в методе convertElement 
 вот код 
Код

 protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
                System.out.println("1111111111 name = "+binder.getObjectName()); // этот метод работает
// далее я регистрирую свой биндер но метод  convertElement  не срабатывает 
 binder.registerCustomEditor(List.class, "Currency", new CustomCollectionEditor(List.class) {
                protected Object convertElement(Object element) {
                 System.out.println("555555555 element = " +element+"'");
  }


 вопрос собсвенно и в том что не так  т,е , что-то не так в строке binder.registerCustomEditor(List.class, "Currency", new CustomCollectionEditor(List.class)
пробовал  binder.registerCustomEditor(Map.class, "list", new CustomMapEditor(Map.class)  // без результата 
 т,е, что нужно написать/сделать чтобы метод convertElement вызывался ?  т,е, что должно быть в параметрах 
 cмотрел доку ничего не понял ,  как нужно правильно регистировать биндер? , 
 чтобы  для начала увидеть результат строки    System.out.println("555555555 element = " +"'"+element+"'");
 что такое propertyEditor в документации ничего не понятно , как с ним работать ?  или я плохо соображаю  smile 
 

 

 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1008 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.