<前文回顾>
<今日更新>
一、DispatcherServlet:Spring MVC 的“大脑”
DispatcherServlet[1] 是 Spring MVC 的“大脑”,它负责接收所有的 HTTP 请求,并把请求分发给对应的处理器(Controller)。DispatcherServlet 的工作原理,说白了就是“接单”和“派单”的过程。它就是个前台,是个咨询处,是个导航。
对应的Servlet,就是web.xml的配置内容的执行逻辑。
1. 接单:接收 HTTP 请求
DispatcherServlet 是 Spring MVC 的前端控制器,所有的 HTTP 请求都得经过它。DispatcherServlet 接单后,会把请求交给 HandlerMapping[2] 去处理。
Java Code |
public class DispatcherServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理请求 } } |
2. 派单:分发请求
DispatcherServlet 接单后,会把请求交给 HandlerMapping 去处理。HandlerMapping 会根据请求的 URL,找到对应的 Controller。
Java Code |
HandlerMapping handlerMapping = getHandlerMapping(request); HandlerExecutionChain handler = handlerMapping.getHandler(request); |
二、HandlerMapping:Spring MVC 的“导航仪”
HandlerMapping 是 Spring MVC 的“导航仪”,它负责根据请求的 URL,找到对应的 Controller。HandlerMapping 的核心思想是“路由”,它把请求的 URL 映射到对应的 Controller 上。
1. RequestMappingHandlerMapping:注解驱动的“导航仪”
RequestMappingHandlerMapping 是 Spring MVC 的默认 HandlerMapping,它支持注解驱动的路由。开发者可以用 @RequestMapping 注解,把请求的 URL 映射到 Controller 的方法上。
Java Code |
@Controller public class MyController { @RequestMapping("/hello") public String hello() { return "hello"; } } |
2. BeanNameUrlHandlerMapping:Bean 名称驱动的“导航仪”
BeanNameUrlHandlerMapping 是 Spring MVC 的另一种 HandlerMapping,它支持 Bean 名称驱动的路由。开发者可以把 Controller 的 Bean 名称设成 URL,Spring MVC 会自动把请求的 URL 映射到对应的 Controller 上。
XML Code |
<bean name="/hello" class="com.example.MyController" /> |
三、Controller:Spring MVC 的“处理器”
Controller 是 Spring MVC 的“处理器”,它负责处理请求,生成响应。Controller 的核心思想是“业务逻辑”,它把请求的数据转换成业务数据,再把业务数据转换成响应的数据。
1. @Controller:标记 Controller
@Controller 是 Spring MVC 的注解,用来标记一个类是 Controller。Controller 通常用来处理 HTTP 请求,生成 HTTP 响应。
Java Code |
@Controller public class MyController { @RequestMapping("/hello") public String hello() { return "hello"; } } |
2. @RequestMapping:映射请求
@RequestMapping 是 Spring MVC 的注解,用来把请求的 URL 映射到 Controller 的方法上。@RequestMapping 支持 GET、POST、PUT、DELETE 等 HTTP 方法。
Java Code |
@Controller public class MyController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello() { return "hello"; } } |
3. @RequestParam:获取请求参数
@RequestParam 是 Spring MVC 的注解,用来获取请求的参数。@RequestParam 支持默认值、必填等参数。
Java Code |
@Controller public class MyController { @RequestMapping("/hello") public String hello(@RequestParam(value = "name", defaultValue = "World") String name) { return "hello " + name; } } |
4. @PathVariable:获取路径变量
@PathVariable 是 Spring MVC 的注解,用来获取路径变量。路径变量是 URL 中的占位符,通常用来传递 ID 啥的。
Java Code |
@Controller public class MyController { @RequestMapping("/hello/{name}") public String hello(@PathVariable String name) { return "hello " + name; } } |
5. @ResponseBody:返回 JSON 数据
@ResponseBody 是 Spring MVC 的注解,用来把方法的返回值转换成 JSON 数据。@ResponseBody 通常和 @RestController 一起用。
Java Code |
@RestController public class MyController { @RequestMapping("/hello") public String hello() { return "Hello, World!"; } } |
四、ViewResolver:Spring MVC 的“视图解析器”
ViewResolver 是 Spring MVC 的“视图解析器”,它负责把 Controller 返回的视图名称解析成实际的视图。ViewResolver 的核心思想是“视图解析”,它把视图名称转换成视图对象。
1. InternalResourceViewResolver:JSP 的“视图解析器”
InternalResourceViewResolver 是 Spring MVC 的默认 ViewResolver,它支持 JSP 视图。开发者可以把视图名称设成 JSP 文件的路径,InternalResourceViewResolver 会自动把视图名称解析成 JSP 文件。
Java Code |
@Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } |
2. ThymeleafViewResolver:Thymeleaf 的“视图解析器”
ThymeleafViewResolver 是 Spring MVC 的另一种 ViewResolver,它支持 Thymeleaf 视图。开发者可以把视图名称设成 Thymeleaf 文件的路径,ThymeleafViewResolver 会自动把视图名称解析成 Thymeleaf 文件。(不建议使用,除非你需要动态响应视图)
Java Code |
@Bean public ViewResolver viewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); return resolver; } |
五、Spring MVC 的“历史”:从 Struts 到 Spring MVC
Spring MVC 从 Struts 的“小弟”变成了“大哥”,它的历史就是 JavaWeb 开发的“进化史”。
1. 2003 年:Spring MVC 1.0 发布
2003 年,Spring MVC 1.0 发布,它用“轻量级”和“灵活性”打败了 Struts,成为了 JavaWeb 开发的“新大哥”。
2. 2009 年:Spring MVC 3.0 发布
2009 年,Spring MVC 3.0 发布,它引入了注解驱动的开发模式,让 Spring MVC 的开发更加简单。
3. 2017 年:Spring MVC 5.0 发布
2017 年,Spring MVC 5.0 发布,它支持了 Reactive 编程模型,让 Spring MVC 的性能更加高效。
六、Spring MVC 的“骚操作”
1. 全局异常处理:从“零散”到“统一”
Spring MVC 支持全局异常处理,能用 @ControllerAdvice 和 @ExceptionHandler 统一处理异常。
Java Code |
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } |
2. 文件上传:从“手动”到“自动”
Spring MVC 支持文件上传,能用 MultipartFile 自动处理文件上传。
Java Code |
@PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) { // 处理文件上传 return "success"; } |
3. 拦截器:从“零散”到“统一”
Spring MVC 支持拦截器,能用 HandlerInterceptor 统一处理请求的前后逻辑。
Java Code |
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 处理请求前的逻辑 return true; } } |
专有名词解释
- DispatcherServlet:Spring MVC 的前端控制器,负责接收所有的 HTTP 请求,并把请求分发给对应的处理器。
- HandlerMapping:Spring MVC 的组件,负责根据请求的 URL,找到对应的 Controller。
- @Controller:Spring MVC 的注解,用来标记一个类是 Controller。
- @RequestMapping:Spring MVC 的注解,用来把请求的 URL 映射到 Controller 的方法上。
- @RequestParam:Spring MVC 的注解,用来获取请求的参数。
- @PathVariable:Spring MVC 的注解,用来获取路径变量。
- @ResponseBody:Spring MVC 的注解,用来把方法的返回值转换成 JSON 数据。
- ViewResolver:Spring MVC 的组件,负责把 Controller 返回的视图名称解析成实际的视图。