SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程

1. Spring MVC 的视图解析机制

Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器(View Resolver) 来将逻辑视图名称解析为具体的视图文件(如 HTML、JSP)。

核心流程

  1. Controller 处理请求

    • Controller 方法可以通过返回 逻辑视图名称ModelAndView 对象来决定视图和数据。
  2. 视图解析器解析视图名称

    • 视图名称由 ViewResolver 解析为实际视图文件路径。
  3. 模型数据绑定到视图

    • 数据由 ModelModelAndView 提供,Spring MVC 会将数据传递给视图引擎渲染。

常见视图解析器

  1. Thymeleaf 视图解析器

    • Spring Boot 默认集成了 Thymeleaf,只需配置模板路径:

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

  1. JSP 视图解析器

    • 通过 InternalResourceViewResolver  或者xml配置文件配置:
    • @Bean
      public InternalResourceViewResolver jspViewResolver() {
          InternalResourceViewResolver resolver = new InternalResourceViewResolver();
          resolver.setPrefix("/WEB-INF/views/");
          resolver.setSuffix(".jsp");
          return resolver;
      }
      


2. ModelModelAndView 的作用与区别

2.1 Model 的作用

  • 职责:仅负责传递数据。
  • 特点
    • Model 是一个数据容器。
    • 不能直接设置视图名称。
    • Spring 自动将 Model 中的数据绑定到视图。
  • 常用场景
    • 数据简单,视图名称固定,返回视图逻辑名称。
@RequestMapping("/exampleModel")
public String example(Model model) {
    model.addAttribute("message", "Hello from Model");
    return "viewName"; // 返回逻辑视图名称
}

2.2 ModelAndView 的作用

  • 职责:同时封装视图名称和数据。
  • 特点
    • 既可以设置视图名称,也可以传递数据。
    • 可以动态调整视图名称和数据,灵活性更高。
  • 常用场景
    • 视图名称需要动态确定,或者需要同时设置多个数据。
@RequestMapping("/exampleModelAndView")
public ModelAndView exampleModelAndView() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("viewName"); // 设置视图名称
    mav.addObject("message", "Hello from ModelAndView");
    return mav;
}

2.3 ModelModelAndView 的对比

特性ModelModelAndView
职责传递数据传递数据并设置视图名称
视图名称设置通过返回值设置通过 setViewName 设置
灵活性较低较高
适用场景固定视图名称,数据传递较简单的场景动态视图名称或需要同时传递多个数据的场景

3. ModelModelAndView 配合视图解析的用法

以下分别说明 ThymeleafJSP 的用法。


3.1 配合 Thymeleaf

(1)使用 Model

通过 Model 传递数据,并返回视图的逻辑名称。

@RequestMapping("/thymeleaf/model")
public String useModel(Model model) {
    model.addAttribute("message", "Hello from Model");
    model.addAttribute("title", "Thymeleaf Example");
    return "example"; // 解析为 /templates/example.html
}

对应 Thymeleaf 模板文件 (example.html):

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${title}">Default Title</title>
</head>
<body>
    <h1 th:text="${message}">Default Message</h1>
</body>
</html>

(2)使用 ModelAndView

通过 ModelAndView 同时设置视图名称和数据。

@RequestMapping("/thymeleaf/modelAndView")
public ModelAndView useModelAndView() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("example"); // 解析为 /templates/example.html
    mav.addObject("message", "Hello from ModelAndView");
    mav.addObject("title", "Thymeleaf Example with ModelAndView");
    return mav;
}

3.2 配合 JSP

(1)使用 Model

通过 Model 传递数据,并返回视图的逻辑名称。

@RequestMapping("/jsp/model")
public String useModel(Model model) {
    model.addAttribute("message", "Hello from Model");
    model.addAttribute("title", "JSP Example");
    return "example"; // 解析为 /WEB-INF/views/example.jsp
}

对应 JSP 文件 (example.jsp):

<!DOCTYPE html>
<html>
<head>
    <title>${title}</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

(2)使用 ModelAndView

通过 ModelAndView 同时设置视图名称和数据。

@RequestMapping("/jsp/modelAndView")
public ModelAndView useModelAndView() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("example"); // 解析为 /WEB-INF/views/example.jsp
    mav.addObject("message", "Hello from ModelAndView");
    mav.addObject("title", "JSP Example with ModelAndView");
    return mav;
}

3.3 总结

特性ThymeleafJSP
视图路径配置classpath:/templates//WEB-INF/views/
支持数据传递支持 ModelModelAndView支持 ModelModelAndView
模板引擎风格现代化 HTML5传统 Java 模板
性能高效较低

4. 综合总结

4.1 ModelModelAndView 的选择

  1. 简单场景:使用 Model 配合返回视图逻辑名称。
  2. 复杂场景:使用 ModelAndView 同时设置视图名称和数据。

4.2 配合视图解析器

  • ThymeleafJSP 均支持 ModelModelAndView,用法完全一致。
  • 如果是新项目,推荐使用 Thymeleaf。

4.3 推荐实践

  • 优先使用 Model 和逻辑视图名称返回方式,更简洁清晰。
  • 在需要动态调整视图名称或复杂数据传递时,使用 ModelAndView

过滤器、拦截器、路径匹配规则与应用

以下是关于 过滤器(Filter)拦截器(Interceptor) 的核心内容,以及路径匹配中 //*/** 的使用规则和场景总结。


1. 过滤器(Filter)

1.1 定义

  • 属于 Servlet 规范的一部分,运行在 Servlet 容器中。
  • 用于对所有 HTTP 请求和响应进行预处理和后处理。

1.2 特点

  • 作用范围广:可以作用于动态资源(如 API 请求)和静态资源(如 HTML、CSS、JS)。
  • 生命周期:由 Servlet 容器管理,启动时初始化过滤器,容器销毁时释放过滤器。
  • 使用场景:适用于跨域处理、编码设置、访问日志记录、请求参数过滤等基础功能。

1.3 示例

  • 典型实现
    @WebFilter("/*")
    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            System.out.println("Filter: Before processing request");
            chain.doFilter(request, response); // 执行后续逻辑
            System.out.println("Filter: After processing request");
        }
    }
    


2. 拦截器(Interceptor)

2.1 定义

  • 属于 Spring 框架的一部分,运行在 Spring MVC 的 DispatcherServlet 内部。
  • 用于拦截由 Spring 处理的动态资源(如控制器方法)。

2.2 特点

  • 作用范围窄:仅作用于 Spring MVC 控制的请求(动态资源)。
  • 生命周期:由 Spring 容器管理,在 Spring 启动时加载,关闭时销毁。
  • 使用场景:适用于业务权限校验、登录校验、动态数据封装等业务逻辑。

2.3 示例

  • 典型实现

    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println("Interceptor: Before handling request");
            return true; // 返回 false 会中断请求
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
                throws Exception {
            System.out.println("Interceptor: After handling request");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println("Interceptor: After rendering view");
        }
    }
    

  • 拦截器注册

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterceptor())
                    .addPathPatterns("/api/**") // 拦截所有 /api 的请求
                    .excludePathPatterns("/static/**"); // 排除静态资源
        }
    }
    


3. 过滤器与拦截器的区别

特性过滤器(Filter)拦截器(Interceptor)
作用范围全局,包含静态资源和动态资源仅作用于 Spring MVC 处理的动态资源
触发时机DispatcherServlet 之前运行DispatcherServlet 内部运行
适用场景跨域、编码设置、日志记录、IP 限制等基础功能登录校验、权限校验、业务逻辑处理等
生命周期管理由 Servlet 容器管理由 Spring 容器管理
实现方式实现 Filter 接口实现 HandlerInterceptor 接口
路径匹配能力通过 /* 等规则匹配所有请求路径支持 /**,匹配所有路径,包括多级子路径
静态资源支持支持静态资源(如 HTML、CSS、JS)不支持静态资源,只作用于动态请求

4. 路径匹配规则与应用

4.1 匹配规则

规则匹配范围适用场景
/仅匹配根路径 /网站首页、主路径请求
/*匹配当前路径下的一级子路径静态资源过滤、一级子路径匹配
/**匹配当前路径及其所有层级子路径拦截器配置、递归匹配所有子路径

5. 综合推荐

  1. 过滤器(Filter)

    • 如果需要对所有请求(包括静态资源)进行操作,使用 /*
    • 常见场景:日志记录、编码设置、跨域处理。
  2. 拦截器(Interceptor)

    • 如果需要对动态请求(如 API 请求)进行操作,使用 /**
    • 常见场景:登录校验、权限控制、封装业务逻辑。
  3. 路径匹配规则

    • /:适用于根路径请求。
    • /*:适用于当前路径的一级子路径。
    • /**:适用于所有子路径的递归匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947262.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于动力学的MPC控制器设计盲点解析

文章目录 Apollo MPC控制器的设计架构误差模型和离散化预测模型推导目标函数和约束设计优化求解优化OSQP求解器参考文献 Apollo MPC控制器的设计架构 误差模型和离散化 状态变量和控制变量 1、Apollo MPC控制器中状态变量主要有如下6个 matrix_state_ Matrix::Zero(basic_stat…

DC-DC 降压转换器设计提示和技巧

基本 DC-DC 降压转换器电路 在开始之前&#xff0c;我们先回顾一下DC-DC降压转换器的电路&#xff1a; 为了帮助您&#xff0c;我开发了降压设计中“什么影响什么”的矩阵&#xff1a; 主要的权衡是电感&#xff08;与 k 因子成反比&#xff0c;即峰峰值与平均电感电流之比&a…

Unity3D仿星露谷物语开发9之创建农场Scene

1、目标 绘制农场的场景。通过不同Sorting Layer控制物体的显示优先级&#xff0c;绘制Tilemap地图&#xff0c;添加Tilemap Collider碰撞器&#xff0c;同时添加Composite Collider碰撞器优化性能。 ps&#xff1a;绘制Tilemap的技巧&#xff1a;通过"Shift [" 可…

Linux 定时任务:轻松创建与精准执行

Linux 定时任务&#xff1a;轻松创建与精准执行 在 Linux 系统的运维与自动化管理领域&#xff0c;定时任务扮演着举足轻重的角色。它能够让系统在预设的时间点或周期性时段&#xff0c;自动执行特定的脚本、命令&#xff0c;极大地减轻了管理员的工作负担&#xff0c;提升工作…

Linux驱动开发:深入理解I2C时序(二)

在Linux驱动开发中,I2C时序的理解和正确处理是保证I2C设备正常工作和通信的关键。I2C协议的时序特性决定了数据的有效传输和设备间的协作。因此,掌握I2C的时序细节,以及如何在Linux内核中进行时序处理,能够让开发者更好地处理设备通信问题。 本文将继续深入探讨I2C通信协议…

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器&#xff0c;历经超过15年的更新和维护&#xff0c;拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力&#xff0c;甚至在某些方面的功能更强(当然&#xff0c;各有千秋)&#xff0c;开发者对文本编辑…

解决uniapp H5页面限制输入框只能输数字问题

工作记录 最最近在做 uniapp 开发的移动端 H5 页面&#xff0c;有个需求是金额输入框只能输入数字&#xff0c;不能输入小数点和其他字符&#xff0c;经过各种尝试&#xff0c;发现其他字符可以通过正则过滤掉&#xff0c;但是输入小数点的话&#xff0c;因为没有触发 input 和…

面试准备备备备

职业技能 放到简历的黄金位置&#xff08;HR刷选简历的重要参考&#xff09; 基本准则&#xff1a;写在简历上的必须能聊&#xff0c;不然就别写 参考公式&#xff1a;职业技能 必要技术 其他技术 针对性的引导面试官&#xff08;让他问一些你想让他问的&#xff09; 寻找合…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools&#xff0c;是因为node-sass4.14.1 一直下载不成功&#xff0c;提示python2 没有安装&#xff0c;最终要安装这个&#xff0c;但是安装这个又失败&#xff0c;主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

【DSP/matlab】fftshift 是什么意思?在信号处理中有什么作用?

文章目录 前言一、定义什么是 fftshift&#xff1f;fftshift 在信号处理中的作用&#xff1a; 前言 dsp_paper 一、定义 fftshift 是一个在信号处理和数字信号处理中常用的函数&#xff0c;特别是在使用快速傅里叶变换&#xff08;FFT&#xff09;时。这个函数的主要作用是将…

【PCIe 总线及设备入门学习专栏 4.2 -- PCI 总线的三种传输模式 】

文章目录 OverviewProgrammed I/O&#xff08;PIO&#xff09;Direct Memory Access (DMA)Peer-to-Peer 本文转自&#xff1a;https://blog.chinaaet.com/justlxy/p/5100053095 Overview 本文来简单地介绍一下PCI Spec规定的三种数据传输模型&#xff1a;Programmed I/O&…

SpringBoot_第二天

SpringBoot_第二天 学习目标 Mybatis整合&数据访问 使用SpringBoot开发企业项目时&#xff0c;持久层数据访问是前端页面数据展示的基础&#xff0c;SpringBoot支持市面上常见的关系库产品(Oracle,Mysql,SqlServer,DB2等)对应的相关持久层框架&#xff0c;当然除了对于关系…

分类模型评估利器-混淆矩阵

相关文章 地理时空动态模拟工具介绍&#xff08;上&#xff09; 地理时空动态模拟工具介绍&#xff08;下&#xff09;地理时空动态模拟工具的使用方法 前言 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…

【SpringMVC】拦截器

拦截器&#xff08;Interceptor&#xff09;是一种用于动态拦截方法调用的机制。在 Spring MVC 中&#xff0c;拦截器能够动态地拦截控制器方法的执行过程。以下是请求发送与接收的基本流程&#xff1a; 当浏览器发出请求时&#xff0c;请求首先到达 Tomcat 服务器。Tomcat 根…

el-table 实现纵向多级表头

为了实现上图效果&#xff0c;最开始打算用el-row、el-col去实现&#xff0c;但发现把表头和数据分成两大列时&#xff0c;数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样&#xff0c;为保持高度样式一致&#xff0c;就需要我们手动去获取最高格的高度之后再设置…

[paddle] 非线性拟合问题的训练

利用paddlepaddle建立神经网络&#xff0c;模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ⁡ ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x)​ 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…

深入理解Python中的常用数据格式(如csv、json、pickle、npz、h5等):存储机制与性能解析

在数据科学与工程领域&#xff0c;数据的存储与读取是日常工作中不可或缺的一部分。选择合适的数据格式不仅影响数据处理的效率&#xff0c;还关系到存储空间的利用与后续分析的便捷性。本文将以通俗易懂的方式&#xff0c;深入探讨Python中几种常用的数据读写格式&#xff08;…

算法 class 005 (对数器C语言实现)

对数器的概念&#xff1a; 用来测试你的算法是否正确。 怎么做呢&#xff1f; 1&#xff1a;比如&#xff0c;写个冒泡排序&#xff0c;作为对比的对象 2&#xff1a;生成一个随机数 数组&#xff0c;用来测试 3&#xff1a;用冒泡排序和你想要验证的那个排序算法&#xff0c;同…

基于AT89C51单片机的可暂停八路抢答器设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90196607?spm1001.2014.3001.5503 C15 部分参考设计如下&#xff1a; 摘要 随着社会进步和科技发展&#xff0c;电子设备在各类活动中的应用日益普遍&#xff0c…