了解在Spring MVC中使用@ModelAttribute和@RequestAttribute注释

时间:2012-12-15 19:43:35

标签: java spring spring-mvc data-binding spring-annotations

我是Spring MVC的新手。目前我正在研究Spring MVC Showcase,它演示了Spring MVC Web框架的功能。

我有一些问题需要了解如何在此示例中处理自定义可解析的Web参数。

在实践中,我有以下情况。在我的 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 value = bar ,在HttpServletRequest对象中,然后custom()方法可以使用此值。

实际上我的输出是:

  

得到'foo'请求属性值'bar'

为什么在 custom()方法之前调用 beforeInvokingHandlerMethod()

为什么 beforeInvokingHandlerMethod()会被 @ModelAttribute 注释注释?在这种情况下它意味着什么?

1 个答案:

答案 0 :(得分:1)

RequestAttribute只是您在表单提交中传递的参数。让我们了解示例

假设我有以下表格

<form action="...">
<input type=hidden name=param1 id=param1 value=test/>
</form>

现在,如果我有下面的控制器与请求网址一起映射,请求网址与表格提交一起映射,如下所示。

@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("param1") String param1 ) {
    // Here, I will have value of param1 as test in String object which will be mapped my Spring itself
}