5 分钟彻底理解 Spring MVC(下)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 处理器配置看到这里,细心的小伙伴可能会有疑问,说好的 DispatcherServlet 将请求分派给 Controller 呢?这里暂时不用着急,Controller 其实是 Spring MVC 的处理器类型之一,这里的 HttpRequestHandler 同样是 Spring MVC 的处理器。

处理器配置


看到这里,细心的小伙伴可能会有疑问,说好的 DispatcherServlet 将请求分派给 Controller 呢?这里暂时不用着急,Controller 其实是 Spring MVC 的处理器类型之一,这里的 HttpRequestHandler 同样是 Spring MVC 的处理器。


Spring 对多种处理器进行了支持,具体则是使用 HandlerAdapter 对处理器进行适配,Spring MVC 内部已经默认了一些适配器,HttpRequestHandler 的适配器是 HttpRequestHandlerAdapter,Controller 的适配器 SimpleControllerHandlerAdapter 也是 Spring MVC 默认支持的。


默认的 HandlerAdapter 已经足够支持日常所需,一般不会自定义 HandlerAdapter。


下面尝试使用 Controller 作为处理器处理请求,定义实现 Controller 接口的 HelloSpringMVCController 类如下。


public class HelloSpringMVCController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/WEB-INF/view/welcome.jsp");
        modelAndView.addObject("hello", "HelloSpringMVCController");
        return modelAndView;
    }
}


然后在 Spring 配置文件中添加这个类作为 bean。


<bean id="/hellocontroller" class="com.zzuhkp.mvc.handler.HelloSpringMVCController"/>


到了这里,终于可以看到 Controller 了,Controller 处理请求,返回了一个类型为 ModelAndView 的对象。


ModelAndView 包含模型和视图,这里向模型中添加了属性 hello,并且指定了/WEB-INF/view/welcome.jsp 文件作为视图名,这个文件内容如下。


<html>
<body>
<h2>Hello,${requestScope.hello}</h2>
</body>
</html>


启动 Tomcat 访问 /hellocontroller 效果如下。


image.png


ViewResolver 配置


为了支持不同的视图,如 JSP、FreeMarker 等,ModelAndView 中的视图名称被设计成虚拟的,具体的视图由视图解析器 ViewResolver 进行解析,默认情况下使用的视图解析器是 InternalResourceViewResolver ,这个视图解析器基于 URL 解析视图。同时也可以向应用上下文中配置自己的视图解析器。添加自定义的 InternalResourceViewResolver 到 Spring 配置文件。


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view"/>
        <property name="suffix" value=".jsp"/>
    </bean>


然后设置视图名时就可以忽略路径前缀/WEB-INF/view和后缀.jsp,配置前缀后缀后上述示例中 HelloSpringMVCController 就可以将视图名从 /WEB-INF/view/welcome.jsp 简化为 welcome。


DispatcherServlet 组件默认配置


上述示例中使用了不少 DispatcherServlet 使用的组件,Spring MVC 默认情况下已经提供了一些,如果需要自定义,则将自定义的组件添加到上下文配置中接口,十分方便,那么 Spring 默认情况下使用了哪些组件处理请求呢?


spring-webmvc 模块类路径下 org/springframework/web/servlet/DispatcherServlet.properties 文件定义了这些默认的配置,具体如下。


9.png


基于注解的 Spring WebMVC


基于配置文件的 Spring Web MVC 项目在前些年确实比较流行,然而现在注解已经成为 Spring 开发的主流。下面通过纯注解的方式对上面的示例进行改造。

pom 文件不需要进行变化,首先要提供 Spring 配置类。


@ComponentScan("com.zzuhkp.mvc")
public class MvcConfig {
}


这里只添加了组件扫描能力,Spring 会将给定包下标注了 @Component 的类作为 bean 进行处理。然后将将这个类设置为配置类即可,这里可以参见使用上述提供的 DispatcherServlet 第二种声明方式

然后提供基于注解的控制器。


@Controller
public class HelloSpringMVCAnnotationController {
    @GetMapping("/helloAnnotationController")
    public String helloMVC(@RequestParam("hello") String hello, Model model) {
        model.addAttribute("hello", hello);
        return "/WEB-INF/view/welcome.jsp";
    }
}


基于注解的控制器不需要实现特定的接口,直接在类上添加 @Controller 注解即可,这里定义了一个处理 /helloAnnotationController 路径 GET 请求方式的方法,并且接收 hello 参数,存放至 model 中,然后返回了视图名。这里直接复用了上面示例中的视图。最终效果如下。


image.png


基于注解的控制器是 Spring MVC 中设计最为灵活的地方,这里可以先考虑下,Spring 是怎么适配用户自定义的控制器的?控制器方法中的参数如何赋值呢?如何将控制器方法的返回值解析为视图?Spring 如何支持 RESTFUL 风格的接口的?后面会写几篇文章继续分析。


DispatcherServlet 请求处理流程


DispatcherServlet 请求处理流程已经穿插在前面的示例中介绍,直接看前面的描述可能不是很直观,这里总结了一张图来梳理整个流程。


10.png

整个流程串联起来如下。


DispatcherServlet 处理浏览器发起的请求。

DispatcherServlet 根据用户或默认的配置使用 HandlerMapping 查找可处理请求的处理器。

DispatcherServlet 拿到 HandlerMapping 返回的处理器链 HandlerExecutionChain。整个处理器链包含拦截器和处理。

DispatcherServlet 将处理器适配为 HandlerAdapter。

DispatcherServlet 使用拦截器进行请求前置处理。

DispatcherServlet 使用处理器进行请求处理。

DispatcherServlet 使用拦截器进行请求后置处理。

DispatcherServlet 从拦截器或处理器中提取到模型及视图 ModelAndView。

DispatcherServlet 使用视图解析器 ViewResolver 解析视图出视图 View。

DispatcherServlet 渲染视图,响应请求。


结束语

本文先介绍 MVC 架构模式,然后通过示例的方式对 Spring MVC 的使用方式及执行流程进行介绍,最后还使用一个流程图总结。


Spring MVC 中所有的扩展都基于 DispatcherServlet 处理请求的这个流程,可以说理解了这个流程图就理解了 Spring MVC 的原理,后面将会对这个流程进行细化,继续介绍 Spring MVC 的其他内容。感兴趣的小伙伴不妨点个关注。


目录
相关文章
|
2月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
127 29
|
3月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
72 4
|
4月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
269 2
|
5月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
6月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
5月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
83 2
|
5月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
352 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
6月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
7月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
7月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)