2013-08-20 100 views
0

我在我的控制器中定義了@ModelAttribute,它需要根據請求的方法輸出執行。所以當我試圖從JSP訪問我的ModelAttribute時,它卻產生了以前的結果。例如下面:@Model在顯示JSP之前執行屬性執行

class MyController{ 

@modelAttribute("Address") 
protected getAddress(HttpRequest req){ 
    HttpSession sess = req.getSession(); 
    return sess.getAttribute("Address");// For example now Address is "Test Address" 
} 

@RequestMapping("sample.do", method=RequestMethod.GET) 
public Model requestMethod(......) 
{ 
    // after execution of this method 
    sess.setAttribute("Address","Changed Address"); 
    return model;// request directed to my JSP. 
} 

} 

當我在我的JSP中使用$ {}的地址,它會顯示「測試地址」,我需要在我的JSP「更改地址」。但是我的ModelAttribute在jsp加載後執行。是否有可能使用@ModelAttribute來做到這一點,如果是這樣,那麼怎麼做? 。除了@ModelAttribute之外,還有其他方法可以實現嗎?

+0

你能提供實際的代碼嗎?你上面的代碼不會編譯。 –

+1

如果您想要將新地址存儲在模型中,那麼...將其存儲在模型中:'model.addAttribute(「Address」,「Changed Address」);' –

+0

model.addAttribute()正在工作,但此ModelAttribute方法被許多控制器用於更大的應用程序。我需要它在單個地方,並且必須在所有JSP中使用。除了ModelAttribute以外,還有其他的方式嗎? – DeepVeen

回答

0

您的流程和ModelAttribute的使用可能不正確/冗餘。

從官方Spring documentation

@ModelAttribute也用於在方法級別爲模型提供參考 數據(參見populatePetTypes()下面方法)。 ..

注:@ModelAttribute註釋的方法將在 選擇@RequestMapping註釋處理程序方法之前執行。 ...

getAddress獲取調用兩次:執行

  • 之前曾經requestMethod(因爲它與RequestMapping註釋)在你的JSP
  • 又一遍。

每次調用它時,都會返回帶有「測試地址」的地址。您應該刪除JSP中的調用(通過刪除表單上的modelAttribute)。在你的情況下,這是多餘的,因爲你已經把requestMethod的更新版本的地址。

+0

model.addAttribute()正在工作,但是這個ModelAttribute方法被許多控制器用在更大的應用中。我需要它在單個地方,並且必須在所有JSP中使用。除了ModelAttribute之外,還有其他方法嗎? – DeepVeen

0

@ModelAttribute,在一個方法上,用於在請求映射方法被調用之前填充模型。因此,如果多個視圖需要顯示地址,則可以在其所有控制器中添加相同的@ ModelAttribute註釋方法,這樣視圖將在模型中查找地址,從而能夠顯示它。

這裏的問題是您的請求映射方法(在@ ModelAttribute註釋的方法後調用)會更改地址的值,但不會在模型中設置地址的新值。所以視圖仍然顯示舊地址,並通過@ ModelAttribute註釋添加到模型中。你不應該有許多方法改變的地址,所以重置模型中的地址應該在那裏完成,而不是在其他地方完成。

也就是說,地址來自會話,所以無論如何它已經可用於所有視圖,而不需要任何@ ModelAttribute註釋的方法(它只在請求中存儲相同的地址)。只是刪除@ ModelAttribute註釋的方法仍然可以讓你訪問視圖中的正確地址,因爲視圖可以訪問存儲在會話中的所有內容。當模型必須包含來自數據庫的數據時,@ModelAttribute非常有用:該方法從數據庫獲取數據,並且該數據存儲在Spring的模型(請求)中。

相關問題