6

我在 Spring MVC 中很新。

在此期间,我正在研究可从 STS 仪表板下载的Spring MVC 展示示例。

我在理解此示例中如何处理自定义可解析 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()一个有名字的方法......所以似乎这个方法设置了一个属性,在一个对象内部有name=fooand ......然后该方法可以使用这个值...value=barHttpServletRequestcustom()

实际上我的输出是:

Got 'foo' request attribute value 'bar'

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

为什么注释beforeInvokingHandlerMethod()@ModelAttribute注释?这个案子是什么意思?

4

1 回答 1

2

你的假设是正确的@RequestAttribute,它不需要设置beforeInvokingHandlerMethod。假设您有一个映射到/data/init将请求转发到的方法/data/custom。在这种情况下,请求属性也可以在 init 方法中设置。

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

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

你会在这里得到原因 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-methods

方法上的 @ModelAttribute 表示该方法的目的是添加一个或多个模型属性。此类方法支持与 @RequestMapping 方法相同的参数类型,但不能直接映射到请求。相反,控制器中的 @ModelAttribute 方法在同一控制器中的 @RequestMapping 方法之前被调用。

于 2012-12-17T18:08:00.123 回答