簡體   English   中英

使用獲取請求的Spring MVC綁定命令對象

[英]Spring MVC Binding Command Object Using Get Request

我需要實現一個具有命令對象的控制器,該命令對象支持用於跨多個條目進行搜索的過濾表單。

問題在於,我被要求不使用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)

謝謝大家!

問候

勝利者。

Okey,我找到了一種存檔所需內容的方法。

我將為那些以前遇到過相同問題的人進行解釋,並希望找到有經驗的用戶來驗證此方法...一些安靜的共同點是,有多種方法可以做相同的事情,而人類很難知道沒有正確地確認正確的路徑..因此,我發現它在AbstractFormController內部查找(這在javadoc中有很好的記錄)。

所以我要做的是,在我的控制器構造函數的末尾添加這些行:

    setSessionForm(true);
    setBindOnNewForm(true);

那一切神奇!

但是使用setSessionForm(true)還不夠。 根據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.
 */

因此,我的猜測是必須將這兩個標志標記為true,因為:

  • setSessionForm使得可以將表單對象存儲為會話屬性,因此“存儲在會話中以在請求之間保留表單對象實例,而不是在每個請求上創建一個新的對象”(根據setSessionForm方法的javadoc)。
  • setBindOnNewForm允許使用初始請求填充表單對象(描述我們擁有的請求方法的類型)。 根據javadoc發現AbstractFormController “僅當bindOnNewForm設置為true時,才會應用ServletRequestDataBinder來使用初始請求參數填充新的表單對象...”

但是,我仍然注意到,在控制器流中使用調試器后,填充正在方法“ getErrorsForNewForm(HttpServletRequest request)”中發生。. 如果 setBindOnNewForm為true,則在其中使用ServletRequestDataBinder類型的具體對象,以后(如javadoc所述),將調用onBindOnNewForm方法,從而允許程序員使用自定義行為覆蓋它,默認行為只是空的(再次針對AbstractFormController的代碼進行了仔細檢查)。

我很想在這里驗證我的想法,因此,如果有任何人可以幫助我,那除了解決問題之外,還可以!

預先感謝所有人!

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM