2009-05-26 81 views
2

我有一個Spring 2.5註釋的控制器,其中我有一個用@RequestMapping(method = RequestMethod.GET)註解的方法,它執行一些邏輯來填充模型。@ModelAttribute註釋參數的數據綁定

我也有一個用@RequestMapping(method = RequestMethod.POST)註解的方法來執行請求。這個方法有一個@ModelAttribute註釋參數,它包含我自己的表單pojo,我們稱之爲MyForm。我也有一個MyForm的初始化方法,也用@ModelAttrribute註解。到目前爲止,所有的工作都如預期的那樣:在POST請求上,表單數據綁定到MyForm,我可以處理它。

問題是我希望能夠通過傳遞(GET)請求參數來預填充表單。由於我有MyForm的@ModelAttribute方法,我在我的模型中得到了一個MyForm實例,但它不會被填充,除非我專門將它用作GET方法的參數。

爲什麼我必須這樣做,是否有可能以不同的方式強制在我的表單上爲GET請求綁定數據?我現在只是傳入參數,但因爲它已經在模型中,我不必對它做任何事情,導致一個醜陋的未使用的方法參數。

[編輯:一些代碼的例子來說明]

不填充在GET請求的形式,所述控制器:

@Controller 
public class MyController { 

    @ModelAttribute("myForm") 
    public MyForm createForm() { 
    return new MyForm(); 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    public void handlePage(Model model) { 
    //Do some stuff to populate the model.... 
    } 

    @RequestMapping(method=RequestMethod.POST) 
    public void processForm(@ModelAttribute("myForm") MyForm myForm) { 
    //Process the form 
    } 
} 

當我改變handlePage方法的方法簽名,它被填充在一個GET請求......

@RequestMapping(method=RequestMethod.GET) 
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) { 
    //Do some stuff to populate the model.... 
} 
+0

當你說你有自己的形式pojo時,你的意思是一些域對象,對吧? (而不是一些自定義的Spring表單實現)。您的視圖也只是一個標準的JSP? – 2009-06-01 23:30:09

+0

是的,你說得對。只是一些域對象。我的觀點不是JSP,但是我會告訴你視圖實現的細節(不是我自己的),因爲我可以單獨編寫一本書... – 2009-06-02 12:19:05

回答

2

@ModelAttribute的方法允許有任何論據@RequestMapping支持,所以舉個例子,你可以根據需要添加多少個參數來填充你的命令對象,甚至是http請求本身。我不確定是否可以用同樣的方式獲取數據聯編程序的實例。

再次讀取文檔,我認爲這個想法是,預人口在@ModelAttribute方法將數據庫驅動的,這可能是爲什麼沒有任何數據綁定發生不添加@ModelAttribute作爲參數傳遞給@RequestMapping方法。