Как переключиться со многих аргументов @RequestParam на @ModelAttribute в методе контроллера Spring

Я новичок в Spring, и мне удалось собрать данные из формы в представлении JSP и отправить мою форму в контроллер. Из данных, полученных из представления, я создаю экземпляр объекта модели, который также содержит другие объекты модели:

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public RedirectView updateAction(ModelAndView model,
@RequestParam(value = "name", defaultValue = "none") String selectedWaveName,
@RequestParam(value = "id", defaultValue = "-1") int id,
@RequestParam(value = "function", defaultValue = "none") String function,
@RequestParam(value = "evidence", defaultValue = "none") String evidence,
@RequestParam(value = "action", defaultValue = "none") String action,
@RequestParam(value = "topicId", defaultValue = "-1") int topicId,
@RequestParam(value = "topic", defaultValue = "none") String topic,
@RequestParam(value = "topicDesc", defaultValue = "none") String topicDesc,
@RequestParam(value = "waveId", defaultValue = "-1") int waveId,
@RequestParam(value = "waveStart", defaultValue = "none") String waveStart,
@RequestParam(value = "waveEnd", defaultValue = "none") String waveEnd)
throws ParseException {

DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date dateStart = formatter.parse(waveStart);;
Date dateEnd = formatter.parse(waveEnd);

waveDAO.updateFormResults(new FormResults(id, 
new Topic(topicId, topic, topicDesc), 
new Wave(waveId, selectedWaveName, dateStart, dateEnd), 
evidence, action, function));
return new RedirectView("/hr/?name=" + selectedWaveName);
}

Как я могу заменить целые строки @RequestParam меньшим количеством строк, используя @ModelAttribute? Нужно ли мне также добавлять аннотацию @ModelAttribute к классам моделей (FormResults, Topic, Wave)?

Спасибо.


person Adrian Bob    schedule 30.08.2012    source источник


Ответы (2)


@ModelAttribute тут особо не нужен. То, что я обычно делаю (но, возможно, не подходит для вашего случая), это объект, содержащий все эти данные:

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public RedirectView updateAction(ModelAndView model, Options options) throws ParseException {
    ...
}

public static class Options {
    private String selectedWaveName,
    private int id,
    ...
    // Getters and setters
}
person sinuhepop    schedule 30.08.2012
comment
привет, спасибо за публикацию, мой вопрос здесь: как я могу отправить параметры объекта со страницы JSP? потому что контроллер, который я разместил, обрабатывает запрос /updateEntry из представления jsp, который обрабатывает данные, отправленные из формы, поэтому я не знаю, как это может работать? - person Adrian Bob; 31.08.2012
comment
@adrianbob: что-то вроде /updateEntry?id=4&selectedWaveName=xxx сработает. - person sinuhepop; 31.08.2012

В конце концов аннотация ModelAttribute сработала, я обнаружил, что при использовании этой аннотации переменные, которые вы передаете из внешнего интерфейса, в моем случае со страницы JSP, должны иметь точно такое же имя, что и атрибуты, объявленные в вашем модель класс!

Например, если у вас есть класс модели, например:

public class FormResults {

private int id;
private Topic topic;
private Wave wave;
private String evidence;
private String action;
private String manager;
 ... }

Также вам нужны методы получения и установки для всех атрибутов класса и конструктор по умолчанию!

Переменные, которые вы отправляете со страницы JSP в метод контроллера, использующий аннотацию @ModelAttribute, будут называться следующим образом:

<input type="text" name="id"     ...
<input type="text" name="evidence" ...
<input type="text" name="action"   ....
<input type="text" name="manager"  ...

И это также работает в случае, когда у вас есть сложный объект, у которого есть другой объект в качестве атрибута (например, в моем случае: тема, волна). Все, что вам нужно сделать, это назвать эти входные данные префиксом имени класса: например: тема, волна, за которыми следуют атрибуты этого класса, например: тема.ид, волна.ид...

И вот подпись моего метода контроллера:

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public ModelAndView updateAction(ModelAndView model,
        @ModelAttribute("fr") FormResults fr) throws ParseException {
...}

Spring автоматически создает объект FormResults. Вот оно! :)

person Adrian Bob    schedule 16.09.2012
comment
Просто совет для будущих читателей: вы также можете просто создать сеттеры с тем же именем, что и параметр (например, public void setAction(private String action) {}), который будет вызываться автоматически через Spring. Таким образом, вы не ограничены именами параметров запроса в объекте запроса (т.е. FormResults). Например, вместо этого вы можете использовать private String lastAction — просто установите его соответствующим образом в сеттере. - person Priidu Neemre; 19.05.2016