SpringMVC执行流程图
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
SpringMVC的常见注解有哪些?
介绍下你对springMVC的理解?
1. Spring MVC 的核心思想
Spring MVC 基于经典的 MVC 模式,将应用程序的不同部分分离为 模型(Model)、视图(View) 和 控制器(Controller)。通过这种分离,开发者可以在不影响其他部分的情况下独立处理数据层、逻辑层和显示层。
Model 负责封装数据,例如从数据库获取的数据。
View 负责展示这些数据,通常是 HTML 或 JSON 响应。
Controller 作为中间层,负责处理请求、调用服务层,并返回结果。
这种分离使得代码更加模块化、易于维护,同时提升了团队协作效率。
2. Spring MVC 的工作流程
Spring MVC 的工作流程基于 DispatcherServlet
,它作为前端控制器(Front Controller),负责将所有请求路由到合适的处理器。流程大致如下:
客户端发送 HTTP 请求,
DispatcherServlet
拦截请求。DispatcherServlet
通过HandlerMapping
查找对应的控制器方法,并将请求交给控制器处理。控制器处理业务逻辑后,返回视图名或数据(JSON 等)。
ViewResolver
将视图名解析为实际的视图(如 JSP、Thymeleaf 模板)。最终由
DispatcherServlet
返回生成的响应给客户端。
这个流程体现了 Spring MVC 的核心设计原则——请求处理集中化 和 职责分离。
3. Spring MVC 的注解驱动编程
在 Spring MVC 中,注解驱动编程极大地简化了开发流程,常用的注解有:
@Controller:定义一个控制器类。
@RequestMapping:用于映射 URL 到控制器方法,可以精确到 HTTP 方法(如 GET、POST)。
@RestController:简化 RESTful API 开发,直接返回 JSON 而不是视图。
@RequestParam 和 @PathVariable:用于处理请求参数和路径变量的绑定。
@RequestBody:将请求体的 JSON 数据绑定到方法参数。
这种注解模式使代码更加简洁,也大大提高了开发效率。
4. 与 RESTful 风格的结合
Spring MVC 非常适合构建 RESTful API,通过 @RestController
、@GetMapping
、@PostMapping
等注解,可以轻松处理 REST 风格的请求。与 Jackson
等库集成后,能够直接返回 JSON 格式的响应,极大地方便了前后端分离开发。
5. Spring MVC 的扩展性
Spring MVC 提供了大量的扩展点,像自定义的拦截器、过滤器、视图解析器等。通过实现 Spring 的接口,如 HandlerInterceptor
或 HandlerExceptionResolver
,可以轻松实现自定义的请求处理逻辑或异常处理逻辑。
说一说SpringMVC的重要组件及其作用?
组件之间的工作流程
客户端请求到达
DispatcherServlet
。DispatcherServlet
使用 处理器映射器 (HandlerMapping) 查找对应的 处理器 (Handler),通常是一个控制器类。找到处理器后,
DispatcherServlet
通过 处理器适配器 (HandlerAdapter) 调用处理器中的逻辑。处理器执行完业务逻辑后,返回一个包含视图名称和模型数据的
ModelAndView
。视图解析器 (ViewResolver) 解析视图名称,将其映射到实际的视图(如 JSP 页面或 Thymeleaf 模板)。
视图 (View) 渲染模型数据,并生成最终的响应。
DispatcherServlet
将生成的响应返回给客户端。
这个表格和流程总结了 Spring MVC 的主要组件及其作用,帮助理解整个请求处理的生命周期。
怎么实现SpringMVC拦截器?
在 Spring MVC 中,拦截器(HandlerInterceptor
)用于拦截请求的处理流程,在请求到达控制器之前、处理之后、以及视图渲染之前执行自定义逻辑。常见的使用场景包括身份认证、权限校验、日志记录等。
实现 Spring MVC 拦截器的步骤
创建拦截器类
注册拦截器
配置拦截的路径
1. 创建拦截器类
要实现拦截器,需要创建一个类并实现 HandlerInterceptor
接口。这个接口提供了三个方法,可以在不同的时机执行拦截逻辑:
preHandle()
:在请求到达控制器之前执行。可以用于身份认证、权限校验等。如果返回false
,则请求被终止。postHandle()
:在控制器方法执行后、视图渲染之前执行。可以用于修改ModelAndView
或记录日志。afterCompletion()
:在整个请求完成后(包括视图渲染完成)执行。通常用于资源清理或者记录最终的日志。
代码示例:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
// 请求到达控制器之前的拦截逻辑
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle: 请求到达控制器之前拦截");
// 返回 true 表示继续处理,返回 false 表示中止请求
return true;
}
// 控制器方法执行完之后,视图渲染之前的拦截逻辑
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle: 控制器方法执行完后拦截");
}
// 请求完成后的清理逻辑
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion: 请求完成后的清理操作");
}
}
2. 注册拦截器
为了让拦截器生效,我们需要在 Spring 的配置类中注册它。Spring Boot 项目中可以通过实现 WebMvcConfigurer
接口来注册拦截器。
代码示例:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器,并指定要拦截的路径
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/login", "/register"); // 排除不拦截的路径
}
}
3. 配置拦截的路径
在注册拦截器时,可以通过 addPathPatterns()
方法指定要拦截的 URL 路径,通过 excludePathPatterns()
排除不需要拦截的路径。例如:
addPathPatterns("/api/**")
:拦截所有/api/
开头的请求。excludePathPatterns("/login")
:不拦截登录路径。
4. 拦截器的典型应用场景
身份认证和权限校验:在
preHandle()
中检查用户是否已登录、是否有权限访问某个资源。日志记录:记录每个请求的开始时间、结束时间、处理时长等。
修改响应数据:在
postHandle()
中,可以根据业务需求修改视图中的数据或添加一些额外信息。资源清理:在
afterCompletion()
中清理资源,比如关闭数据库连接、记录请求日志等。
拦截器和过滤器的区别
拦截器:基于 Spring MVC 的组件,能处理 Spring 内部的请求和响应处理。主要用于控制器层面的逻辑处理。
过滤器:基于 Servlet 规范,在整个请求生命周期中执行,通常用于全局范围的请求处理。
总结
Spring MVC 拦截器是一种强大的工具,可以在请求处理流程的不同阶段执行自定义逻辑。通过实现 HandlerInterceptor
接口并在配置类中注册拦截器,可以轻松地在项目中实现如认证、日志、请求监控等功能。
MVC是什么?MVC设计模式的好处有哪些
MVC(Model-View-Controller)是一种软件架构模式,用于构建用户界面的应用程序。它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),使得各个组件之间的职责分离,从而提高代码的组织性和可维护性。
MVC 的组成部分
模型(Model):
负责管理应用程序的数据和业务逻辑。
处理数据的获取、存储和更新。通常对应数据库或其他数据源。
通常不直接与用户界面交互,而是通过控制器或视图来传递数据。
视图(View):
负责呈现模型数据的用户界面。
将模型数据格式化成用户能够理解的形式,如 HTML、JSON、图形等。
视图通常监听模型的变化,以便在数据更新时自动更新显示内容。
控制器(Controller):
充当模型和视图之间的中介,处理用户输入和请求。
接收用户的输入(例如按钮点击、表单提交等),并调用相应的模型来处理请求。
更新视图,以便将新的数据呈现给用户。
MVC 设计模式的好处
分离关注点:
将数据、业务逻辑和用户界面分开,使得每个组件都有清晰的责任。这种分离有助于降低系统的复杂性,提高可维护性。
提高可维护性:
由于各个组件之间的松耦合,修改一个组件(如视图)不会影响到其他组件(如模型和控制器),从而简化了代码的维护和扩展。
支持多种视图:
同一个模型可以支持多种视图,开发者可以根据需要开发不同的用户界面,而不必重复实现业务逻辑。
增强的测试能力:
由于模型和视图的分离,开发者可以对业务逻辑进行单元测试,而不必依赖于用户界面。这使得测试更加高效和全面。
协作开发:
不同的开发人员可以同时工作在模型、视图和控制器上,从而提高开发效率。设计师可以专注于视图,而后端开发者可以专注于模型和控制器。
用户界面的灵活性:
可以在不改变业务逻辑的情况下轻松更改用户界面的布局和外观。这对于快速迭代开发和用户体验优化非常重要。
总结
MVC 设计模式通过清晰地分离模型、视图和控制器,提高了应用程序的结构化程度,使得开发、维护和扩展变得更加高效。它在现代 Web 开发和桌面应用程序开发中被广泛应用,为开发者提供了强大的工具和方法。