如何在这个Spring MVC展示示例中使用@RequestAttribute和@ModelAttribute注释?

时间:2012-12-17 17:47:42

标签: java spring spring-mvc model annotations

我是Spring MVC的新手。

在此期间,我正在研究STS信息中心可下载的Spring MVC showcase示例。

我在理解本例中如何处理Custom Resolvable Web Arguments时遇到了一些问题。

在实践中,我有以下情况:

在我的home.jsp视图中,我有以下链接:

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

此链接会向网址生成HTTP请求:“/ data / custom”

包含处理此请求的方法的控制器类具有以下代码:

@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()方法,它有一个有着名的...所以看起来这个方法选择了一个属性,它有name=foo和{ {1}},在value=bar对象中...然后HttpServletRequest方法可以使用此值......

实际上我的输出是:

custom()

为什么在Got 'foo' request attribute value 'bar'方法之前调用beforeInvokingHandlerMethod()

为什么custom()注释了beforeInvokingHandlerMethod()注释?这个案子意味着什么?

1 个答案:

答案 0 :(得分: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方法。