--- 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 的工作流程可以用一幅图来说明: ![img](https://raw.githubusercontent.com/dunwu/images/master/cs/java/spring/web/spring-dispatcher-servlet.png) 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)