2012-08-30 119 views
4

我是Spring的新手,我設法從JSP視圖中的表單中收集數據並將我的表單提交給控制器。從視圖獲得性的數據,我實例化一個模型對象,其中還包含其他模型對象:如何在Spring Controller方法中從多個@RequestParam參數切換到@ModelAttribute

@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)?

謝謝。

回答

1

的的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)。 所有你需要做的就是用類名的前綴命名這些輸入:例如:主題,波,然後是該類的屬性,例如:topic.id,wave.id ...

這是我的控制器方法的簽名:

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

Spring會自動創建一個FormResults對象。這就是它! :)

+0

只爲未來的讀者提供一個提示:你也可以創建一個與參數同名的setter(*例如*'public void setAction(private String action){}'),它將通過Spring自動調用。這樣您就不會受限於請求對象中的請求參數名稱(*即* FormResults)。例如,你可以有一個'private String lastAction'來代替 - 只需在setter中設置它。 –

3

@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 
} 
+0

你好,感謝發佈,我的問題在這裏是:我怎麼能從jsp頁面發送對象選項選項?因爲我發佈的控制器正在處理來自jsp視圖的/ updateEntry請求,該視圖處理從表單發送的數據,所以我不知道它如何工作? –

+0

@adrianbob:類似於'/ updateEntry?id = 4&selectedWaveName = xxx'的東西會起作用。 – sinuhepop

相關問題