SpringMVC-学习

概述
MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,用一种将业务逻辑、数据、显示分离的方法组织代码,MVC主要作用是降低了视图与业务逻辑间的双向偶合。

常见的服务器端MVC框架有Spring MVC,由MVC演化出了另外一些模式如:MVP、MVVM。

了解Web开发
Web开发的本质是围绕HTTP(S)协议展开的,而非依赖于特定的技术实现(如Servlet)。Web应用的核心就是处理HTTP请求响应

二、Springmvc原理解析

请求处理流程和组件职责
1.DispatcherServlet
DispatcherServlet(中央调度器)截获所有Http请求,是整个流程的入口,它不直接处理业务逻辑,负责协调各组件完成处理请求。

2.HandlerMapping
当请求被截获后委托给HandlerMapping(处理器映射器)进行解析映射工作。找到匹配的处理器(Controller方法)。

3.处理器适配
并将请求传递给HandlerAdaptor,并返回一个 HandlerExecutionChain 对象。该对象包含目标处理器方法及查找是否有拦截器,若该HandlerExecutionChain 对象中存在处理器。则按照拦截器注册顺序执行。如果某个拦截器执行perHandle()方法返回false,则代表流程终止并直接返回响应。

4.通过适配器回到中央调度器
HandlerAdapte(处理器适配器)负责调用具体的Controller方法(参数解析、方法执行、返回值处理)将方法返回值封装为ModelAndView对象

5.视图解析与渲染
最后返回ModelAndView对象(或其他类型,如 JSON 数据)给ViewResolver(视图解析器),ViewResolver将逻辑视图名("home")解析成具体的View(视图)对象将数据渲染为HTML或其他格式,生成最终响应内容。

6.拦截器最终处理
无论流程是否异常,拦截器的 afterCompletion() 方法最终会被调用,用于资源清理或日志记录。

7.响应返回
最后由DispatcherServlet(中央调度器)将渲染结果写入HTTP响应,返回给客户端。

补充:

  • 异常处理:
    若流程中出现异常,HandlerExceptionResolver 会捕获并处理异常,返回错误页面或 JSON 错误信息(如通过 @ControllerAdvice 全局处理)。

  • 文件上传:
    若请求包含文件(multipart/form-data),MultipartResolver 会提前解析请求,提取文件数据供 Controller 处理。

  • 静态资源:
    DispatcherServlet 默认拦截所有请求,但可通过配置 ResourceHandler 将静态资源(如 /css/**)交由容器直接处理,无需经过 MVC 流程。

三、控制器创建与@RequestMapping解析
1.1控制器创建
控制器提供访问应用程序的行为,通常控制器有两种不同的创建方式,通过实现不同接口或使用不同注解,创建多种类型的控制器。

在自定义控制器前先在maven的web项目下,添加包的依赖,pom.xml文件如下

1)实现Controller接口

2)使用@Controller注解
唯一:注解式开发(推荐)

定义Controller层

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "index";
    }
}

定义主配置类,用于导入其他模块的配置类

@Configuration
@ComponentScan(basePackages = "yourPackageLocation")
//启用mvc注解驱动
@Import({MvcConfig.class,...})
public class RootConfig {
}

定义SpringMvc配置类

@Configuration
//启用mvc注解驱动
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        //实例化内部资源视图解析器
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        //设置前缀
        viewResolver.setPrefix("/WEB-INF/jsp/");
        //设置后缀
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }
}

本质取代web.xml配置,这里主要用于设置DispatchServlet的映射相关配置类

 /**
     * 设置主配置类
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    /**
     * 设置mvc配置类
     * 在web环境下通过DispatcherServlet初始化唯一的IOC容器
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{RootConfig.class};
    }

    /**
     * 用于设置DispatcherServlet的映射路径
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

重点:解析 AbstractAnnotationConfigDispatcherServletInitializer接口

  • 它是Spring MVC的核心组件用于DispatcherServlet初始化,客户端请求会首先到达这里,负责请求再其他各组件(组件:拥有特定功能的类,例如:servlet、自定义工具类)之间的传递加工。

  • 该基类实现了 WebApplicationInitializer 接口中配置servlet容器的功能

  • 因为RootConfig配置类引入了SpringMVC的配置类,从而可以直接通过子容器加载了本应由父容器管理的配置,将原本的父子容器隔离隐式合并为单一容器

Spring 官方设计:

@Override  
protected Class<?>[] getRootConfigClasses() {  
    return new Class[]{RootConfig.class}; // 父容器:业务层、数据层  
}  
@Override  
protected Class<?>[] getServletConfigClasses() {  
    return new Class[]{MvcConfig.class};  // 子容器:Web 层  
}  

3)实现HttpRequestHandler接口

posted @ 2025-05-09 15:43  Mr_Keep  阅读(16)  评论(0)    收藏  举报