[英]Making ModelAttribute optional in Spring Controller method
[英]How to switch from many @RequestParam arguments to @ModelAttribute in a Spring Controller method
我剛開始使用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);
}
如何使用@ModelAttribute用更少的行替換整個@RequestParam行? 我是否還需要將@ModelAttribute注釋添加到模型類(FormResults,Topic,Wave)?
謝謝。
這里不需要@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
}
ModelAttribute注釋最終確實起作用,我發現在使用這個注釋時,你從前端傳遞的變量(在我的例子中來自JSP頁面)應該與你聲明的屬性具有完全相同的名稱。模特班!
例如,如果您有一個模型類,如:
public class FormResults {
private int id;
private Topic topic;
private Wave wave;
private String evidence;
private String action;
private String manager;
... }
您還需要所有類屬性的getter和setter方法,以及默認構造函數!
您從JSP頁面發送到使用@ModelAttribute注釋的控制器方法的變量將命名為:
<input type="text" name="id" ...
<input type="text" name="evidence" ...
<input type="text" name="action" ....
<input type="text" name="manager" ...
這也適用於你有一個復雜的對象,它有另一個對象作為屬性(就像我的情況:Topic,Wave)。 您所要做的就是使用類名前綴命名這些輸入:ex:topic,wave,后跟那些類屬性,例如:topic.id,wave.id ......
這是我的控制器方法的簽名:
@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public ModelAndView updateAction(ModelAndView model,
@ModelAttribute("fr") FormResults fr) throws ParseException {
...}
Spring會自動創建一個FormResults對象。 就是這樣! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.