---
title: Spring Web 综述
date: 2017-11-08 16:53:27
order: 01
categories:
- Java
- 框架
- Spring
- SpringWeb
tags:
- Java
- 框架
- Spring
- Web
permalink: /pages/83fee2f7/
---
# Spring Web 综述
## 快速入门
下面,通过一个简单的示例来展示如何通过 Spring 创建一个 Hello World Web 服务。
(1)`pom.xml` 中引入依赖
```xml
org.springframework.boot
spring-boot-starter-web
```
(2)定义 Controller
Spring 构建 RESTful 服务的方法,HTTP 请求由 `Controller` 处理。 这些组件由 `@RestController` 注解标识。
【示例】下面的示例定义了一个处理 `/greeting` 的 GET 请求
```java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name,
Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
```
(3)创建启动类
```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class);
}
}
```
(4)启动服务:执行 `HelloWorldApplication.main` 方法启动 web 服务
(5)测试
打开浏览器,访问 http://localhost:8080/greeting,页面会显示如下内容:
```json
Hello, World!
```
打开浏览器,访问 http://localhost:8080/greeting?name=dunwu,页面会显示如下内容:
```
Hello, dunwu!
```
## SpringMVC 工作流程
Spring MVC 的工作流程可以用一幅图来说明:

1. 向服务器发送 HTTP 请求,请求被前端控制器 `DispatcherServlet` 捕获。
2. `DispatcherServlet` 根据 **`-servlet.xml`** 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 `HandlerMapping` 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以`HandlerExecutionChain` 对象的形式返回。
3. `DispatcherServlet` 根据获得的`Handler`,选择一个合适的 `HandlerAdapter`。(附注:如果成功获得`HandlerAdapter`后,此时将开始执行拦截器的 preHandler(...)方法)。
4. 提取`Request`中的模型数据,填充`Handler`入参,开始执行`Handler`(`Controller`)。 在填充`Handler`的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:
- HttpMessageConverter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。
- 数据转换:对请求消息进行数据转换。如`String`转换成`Integer`、`Double`等。
- 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
- 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到`BindingResult`或`Error`中。
5. Handler(Controller)执行完成后,向 `DispatcherServlet` 返回一个 `ModelAndView` 对象;
6. 根据返回的`ModelAndView`,选择一个适合的 `ViewResolver`(必须是已经注册到 Spring 容器中的`ViewResolver`)返回给`DispatcherServlet`。
7. `ViewResolver` 结合`Model`和`View`,来渲染视图。
8. 视图负责将渲染结果返回给客户端。
## 参考资料
- **官方**
- [Spring 官网](https://spring.io/)
- [Spring Framework 官方文档](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/index.html)
- [Spring Github](https://github.com/spring-projects/spring-framework)
- **书籍**
- [《Spring In Action》](https://item.jd.com/12622829.html)
- **教程**
- [《小马哥讲 Spring 核心编程思想》](https://time.geekbang.org/course/intro/265)
- [geekbang-lessons](https://github.com/geektime-geekbang/geekbang-lessons)
- [跟我学 Spring3](http://jinnianshilongnian.iteye.com/blog/1482071)