本节书摘来自异步社区《精通Spring MVC 4》一书中的第2章,第2.5节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.5 Spring MVC架构
让我们从这个新的“Hello World”页面后退一步,尝试去理解在这个Web应用中到底发生了什么。为了做到这一点,需要跟踪浏览器所发送的HTTP请求的行程以及它是如何从服务器端得到响应的。
2.5.1 DispatcherServlet
每个Spring Web应用的入口都是DispatcherServlet。图2-3展现了DispatcherServlet的架构。
图2-3
这个一个典型的HttpServlet类,它会将HTTP请求分发给HandlerMapping。HandlerMapping会将资源(URL)与控制器关联起来。
控制器上对应的方法(也就是带有@RequestMapping注解的方法)将会被调用。在这个方法中,控制器会设置模型数据并将视图名称返回给分发器。
然后,DispatcherServlet将会查询ViewResolver接口,从而得到对应视图的实现。
在样例中,ThymeleafAutoConfiguration将会为我们搭建视图解析器。
通过查看ThymeleafProperties类,可以知道视图的默认前缀是“classpath:/templates/”,后缀是“.html”。
这就意味着,假设视图名为resultPage,那么视图解析器将会在类路径的templates目录下查找名为resultPage.html的文件。
在我们的应用中,ViewResolver接口是静态的,但是更为高级的实现能够根据请求的头信息或用户的地域信息,返回不同的结果。
视图最终将会被渲染,其结果会写入到响应之中。
2.5.2 将数据传递给视图
第一个页面完全是静态的,其实并没有真正发挥出Spring MVC的威力。我们现在更进一步,如果“Hello World”这个字符串不是硬编码的,而是来源于服务器,那该怎么实现呢?
你可能会问,还是显示这个无聊的“hello world”吗?是的,不过这种方式会开启更多的可能性。现在,修改resultPage.html文件,让它展现来自模型中的信息:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8"/>
<title>Hello thymeleaf</title>
</head>
<body>
<span th:text="${message}">Hello html</span>
</body>
</html>
然后,我们修改控制器,将该信息保存到模型中:
@Controller
public class HelloController {
@RequestMapping("/")
public String hello(Model model) {
model.addAttribute("message", "Hello from the controller");
return "resultPage";
}
}
我```
知道,这种悬疑的感觉会让你觉得很受折磨!那么,我们访问http://localhost:8080,看一下效果是什么样子的(见图2-4)。
![screenshot](https://yqfile.alicdn.com/b852fadeff3a1c056b29cc1cd9b6fced39cd9e2c.png)
图2-4
需要注意的第一件事情就是传递了一个新的参数到控制器的方法之中,DispatcherServlet会提供正确的对象。实际上,很多对象都可以注入到控制器的方法之中,例如HttpRequest、HttpResponse、Locale、TimeZone和Principal,其中Principal代表了一个认证过的用户。