7

我在 Spring MVC 中很新。目前我正在研究Spring MVC Showcase,它展示了 Spring MVC Web 框架的特性。

我在理解此示例中如何处理自定义可解析 Web 参数时遇到了一些问题。

在实践中,我有以下情况。在我的home.jsp视图中,我有以下链接:

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

此链接生成一个对 URL 的 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()方法,它有一个说话的名字,所以这个方法似乎在 HttpServletRequest 对象中设置了一个属性,它有name=foovalue=bar,然后所以 custom() 方法可以使用这个值。

实际上我的输出是:

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

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

以及为什么beforeInvokingHandlerMethod()@ModelAttribute注释注释了?在这种情况下是什么意思?

4

1 回答 1

1

RequestAttribute 只不过是您在表单提交中传递的参数。让我们通过一个示例来理解

假设我有以下表格

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

现在,如果我有以下控制器,该控制器与请求 url 映射,该请求 url 与以下表单提交映射。

@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
}
于 2012-12-15T19:59:22.537 回答