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 开发和桌面应用程序开发中被广泛应用,为开发者提供了强大的工具和方法。