2014-03-13 63 views
0

我需要實現有來頭的過濾形式在多個搜索條目的命令對象的控制命令對象。Spring MVC的綁定使用GET請求

的問題是,我被要求做,沒有使用POST請求,而不是使用GET請求只,並有失去的缺省數據綁定彈簧使愉快地爲我們的功能之前。

所以我試圖實現一個方法,我的控制器內,看起來像這樣:

@Override 
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) 
     throws Exception { 
    if (isSearchRequest(request)) { 
     MyCommandObject myCommandObject = (MyCommandObject) getCommand(request); 
     System.out.println(managePositionsForm); 
    } 
    return super.handleRequestInternal(request, response); 
} 

但getCommand返回我沒有值的全新CommandObject,儘管該值出現在請求對象(我可以使用HttpServletRequest的getParameter方法檢索)。但沒有任何約束力。

所以問題:

1)有沒有什麼辦法來存檔呢?

2)同樣非常重要的是,表單中的所有值都會丟失,並且最終(如果此問題得到解決),我將需要爲用戶「堅持」過濾器,以避免重新進入第一次搜索。

  • 自動回覆:setSessionForm(true);看起來可以做的工作! (據的javadoc)

感謝所有!

Greetings

Victor。

+2

看來你是說你不能用GET做數據綁定到命令對象(只有POST - 第二段)?這是不正確的 - GET也適用! – nickdos

+0

謝謝Ashot!你能指定我該怎麼做,或者我可以在哪裏找到解決問題的方法?你是說setSessionForm(true)完成所有的魔法? – Victor

回答

1

奧基,我找到了一種方法來歸檔什麼一直在尋找。

我會解釋爲了那些之前有同樣的問題,希望找到一個有經驗的用戶來驗證這種方法...一些安靜的共同點是有多種方式來做同樣的事情和人類是很難知道沒有適當的承認正確的道路..所以這個ia找到了內部的AbstractFormController(這是與javadoc出色的記錄)。

所以我所做的就是下面,在我的控制器構造我在末尾添加這些行:

setSessionForm(true); 
    setBindOnNewForm(true); 

這所有的魔法!

但不與setSessionForm(真)足夠多。據Javadoc中setBindOnNewForm(boolean)方法執行以下操作:

/** 
* Set if request parameters should be bound to the form object 
* in case of a non-submitting request, i.e. a new form. 
*/ 

所以我的猜測是,這兩個標誌是必要的,被標記爲真實的,因爲:

  • 的setSessionForm讓更多鈔票來存儲作爲表單對象的會話屬性,因此「存儲在會話中以保持請求之間的表單對象實例,而不是在每個請求上創建新的表單」(根據setSessionForm方法的javadoc)。
  • 的setBindOnNewForm允許形式對象的與初始請求的人口(despites什麼請求方法的類型,我們有)。據Javadoc中發現AbstractFormController「只有bindOnNewForm設置爲true,那麼ServletRequestDataBinder被應用於填充初始請求參數的新形式對象......」

但儘管如此,我注意到,在與一個控制器流調試器,即人口發生在方法「getErrorsForNewForm(HttpServletRequest請求)」中..這就是使用ServletRequestDataBinder類型的具體對象的地方IF setBindOnNewForm爲true,並且稍後(如javadoc所述)onBindOnNewForm方法是被調用,允許程序員用自定義行爲覆蓋它,默認行爲只是空的(再次對照AbstractFormController的代碼進行檢查)。

我有一個強大的感覺來驗證我的想法,所以如果任何人都可以幫助我,那就沒事了,除了問題解決了!

感謝所有提前!

問候。