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
接口