2013-03-20 110 views
0

我一直在使用下面的代碼:可以使用ModelAttribute作爲RequestMapping方法的方法參數嗎?

@RequestMapping(value="/myUrl", method=RequestMethod.GET) 
public ModelAndView myRequestHandler(
    HttpServletRequest request, HttpServletResponse response, 
    @ModelAttribute(value="paramName") @ValidMyModelForm form) 
// automatically populates form setters from form:form in JSP view 
{ 
} 

在以下鏈接我開始懷疑我的ModelAttribute的用法是錯誤的在這裏讀的答案。

What is @ModelAttribute in Spring MVC?

我使用它的正確方法?它似乎工作,但要確保我沒有做錯什麼。

形式對象添加在看起來像一個單獨的使用方法的代碼來建模:

modelAndView.addObject("formName", new MyModelForm()); 

在JSP視圖我有一個形式名稱加入作爲commandName="formName"

+1

確保您是否做錯了或不做的唯一方法就是嘗試一下。 – 2013-03-20 23:31:10

+0

哦,它到目前爲止一直工作正常......但我想檢查是否濫用了創建新bean的事實,並且當自動裝配的bean與我的模型屬性具有相同的名稱時調用setter。雖然它起作用,但我想了解它是否偶然運行,如果有的話,是否還有一種更「標準方式」使用form:form在春季? – 2013-03-20 23:54:40

+0

關聯問題中的解釋讓我重新思考這種編碼方式。 – 2013-03-20 23:56:30

回答

0

這個簽名也應該完全爲你工作:

public ModelAndView myRequestHandler(@Valid MyModelForm form) 

這裏的Spring MVC將確保MyModelForm實例被創建和綁定的依據是什麼,從你的表單提交。現在

,什麼是附加@ModelAttribute爲您帶來:

首先簡單情況:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form) 

假設你沒有與@ModelAttribute,上面有哪些需要做的是尋找一個模型中的任何其他方法通過名稱paramName,由於該假設不太可能存在,那麼MyModelForm的一個實例將像以前一樣被創建並綁定,另外還有一個模型對象,其名稱爲paramName,可用於您的查看: paramName.myformValue等。

本質

所以:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form) 

等同於:

public ModelAndView myRequestHandler(@Valid MyModelForm form, Model model) { 
    ... 
    model.addAttribute("paramName", form) 
} 

其次,如果您有@ModelAttribute註解的方法,它預載說你MyModelForm的一部分:

@ModelAttribute("paramName"); 
public MyModelForm loadModel(int id) { 
    MyModelForm fromDB = loadFromDB(id); 
} 

現在,您的方法簽名的優點是:

public ModelAndView myRequestHandler(@ModelAttribute("paramName") @Valid MyModelForm form) 

將是您從您的數據庫預先填充模型,將是什麼形式提交增強。

+0

我看到...既然你說優勢......這是否意味着它是JSP和模型中連接spring' '標籤的首選/唯一方式。 – 2013-03-21 01:40:52

+0

由於模型將隨着我在表單中提交的內容而得到增強,我希望它只是我的表單副本,而不是數據庫的數據副本自動修改。我想對裝飾JPA實體的模型表單進行一些檢查。 – 2013-03-21 01:46:16

+0

思考我的問題......我想如果我在某個時間點將實體作爲參數調用合併,那麼應該將更改發送到數據庫。另外這個推理依賴於這樣一個事實,即每次我使用ajax獲取表單時,都會在模型表單的構造函數中使用新的ModelEntity()創建一個新的ModelForm。用戶填充除主鍵字段以外的所有字段並提交表單。我根據表單中的其他參數設置主鍵字段。我想這應該沒問題,只要我不叫合併。 – 2013-03-21 02:26:38

相關問題