2012-12-17 32 views
2

我在Spring MVC中很新穎。在此Spring MVC展示示例中,如何使用@RequestAttribute和@ModelAttribute註解?

在此期間,我正在研究從STS儀表板中downlodable的Spring MVC showcase示例。

我在理解如何處理Custom Resolvable Web Arguments的例子中遇到一些問題。

在實踐中,我有以下情況:

在我回到Home.jsp觀點,我有以下鏈接:

<a id="customArg" class="textLink" href="<c:url value="/data/custom" />">Custom</a> 

此鏈接生成對URL的HTTP請求:「/數據/定製」

控制器類,它包含處理這一請求的方法具有下面的代碼:

@Controller 
public class CustomArgumentController { 

@ModelAttribute 
void beforeInvokingHandlerMethod(HttpServletRequest request) { 
    request.setAttribute("foo", "bar"); 
} 


@RequestMapping(value="/data/custom", method=RequestMethod.GET) 
public @ResponseBody String custom(@RequestAttribute("foo") String foo) { 
    return "Got 'foo' request attribute value '" + foo + "'"; 
} 

} 

處理這個HTTP請求custom()

所以,當一個鏈接被點擊的HTTP請求由自定義的方法處理的方法...

我有理解的問題是什麼@RequestAttribute註解。

我認爲,在這種情況下,它將名爲foo的請求屬性綁定到新的String foo變量。

但是...這個屬性取自哪裏?這個變量是由Spring採用的嗎?

好吧......我的想法是,這個請求屬性是從HttpServletRequest對象採取...

我想這是因爲,在這個類中,我也有beforeInvokingHandlerMethod()方法有speacking名。 ..所以似乎這個方法剛毛的屬性,有name=foovalue=bar,一個HttpServletRequest對象內......然後讓custom()方法可以使用這個值...

其實我的輸出是:

Got 'foo' request attribute value 'bar'

爲什麼在之前調用custom()方法?

爲什麼beforeInvokingHandlerMethod()註釋由@ModelAttribute註釋?這個案子是什麼意思?

回答

1

你假設@RequestAttribute是正確的,它不需要設置在beforeInvokingHandlerMethod。假設您有一個映射到/data/init的方法,該方法將請求轉發給/data/custom。在這種情況下,請求屬性也可以在init方法中設置。

爲什麼在調用custom()方法之前調用beforeInvokingHandlerMethod()?

爲什麼beforeInvokingHandlerMethod()被@ModelAttribute註解標註?在這種情況下是什麼意思?

你會得到一個方法的原因就在這裏 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-methods

的@ModelAttribute表明該方法的目的是要添加一個或多個模型屬性。這些方法支持與@RequestMapping方法相同的參數類型,但不能直接映射到請求。相反,在同一個控制器內的@RequestMapping方法之前調用控制器中的@ModelAttribute方法。

+0

嗯,我有一些困難,瞭解在這個例子中tath我有完全發生後... 所以讀你已經張貼我有什麼瞭解,如果我有一個命令類與RequestMapping註釋annoted一些方法和其他一些由ModelAttribute註解的方法......這些第二種類型的方法在RequestMapping註解的方法之前調用... 所以這個方法做類似inizialization的事情 在我的情況下究竟發生了什麼?我在傳遞的HttpServletRequest中存儲一個名爲foo的屬性... ok 現在執行只提取屬性值的custom()方法嗎? – AndreaNobili

+0

是@ModelAttribute方法將在控制器類中的任何請求處理程序之前首先被調用。你在這個方法中做的是設置request屬性,你可以在你的處理器方法中檢索它。 – Subin

+0

'字符串自定義(@RequestAttribute(「foo」)foo'這是一個方便的方法,其他的方式你必須寫'String foo =(String)request.getAttribute(「foo」);' – Subin

相關問題