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.htmlmav.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.jspmav.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 {@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("Interceptor: Before handling request");return true; // 返回 false 会中断请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {System.out.println("Interceptor: After handling request");}@Overridepublic 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 {@Overridepublic 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. 路径匹配规则

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抽象类和接口的区别是什么?

抽象类和接口在编程中都是用来定义对象的公共行为的重要概念&#xff0c;但两者之间存在显著的区别。以下是对抽象类和接口的详细比较&#xff1a; 一、定义与关键字 抽象类&#xff1a;使用abstract关键字定义&#xff0c;表示该类是抽象的&#xff0c;不能被实例化。抽象类…

html+css+js网页设计 美食 美拾9个页面

htmlcssjs网页设计 美食 美拾9个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff0…

Linux下PostgreSQL-12.0安装部署详细步骤

一、安装环境 postgresql-12.0 CentOS-7.6 注意&#xff1a;确认linux系统可以正常连接网络&#xff0c;因为在后面需要添加依赖包。 二、pg数据库安装包下载 下载地址&#xff1a;PostgreSQL: File Browser 选择要安装的版本进行下载&#xff1a; 三、安装依赖包 在要安…

『VUE』vue-quill-editor设置内容不可编辑(详细图文注释)

目录 预览思路调用代码借助Props添加isDisable属性控制 是否内容可编辑总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 预览 思路 禁用焦点事件和内容改变事件 调用代码 <quillEditorclass"editor":class"…

python 和go 语法对比

Python 和 Go 是两种设计哲学和应用场景有所不同的编程语言&#xff0c;它们在语法、类型系统、并发模型等方面存在显著差异。以下是 Python 和 Go 语法特点的详细对比&#xff1a; 语法简洁性与结构 Python 的语法以其简洁易读而著称。它使用缩进来表示代码块的层次结构&…

我们来学activiti -- bpmn

bpmn 题记bpmn结余 题记 在《Activiti很难学》提到学习知识点需要面对的思想钢印问题 按常见步骤&#xff0c;先展示下官方的客套话 BPMN&#xff08;Business Process Model and Notation&#xff09;是一种业务流程建模符号&#xff0c; 它是一种图形化的语言&#xff0c;用…

【MuJoCo和PhysX】

MuJoCo 与 Unity 的 PhysX 引擎的主要区别 应用领域&#xff1a; MuJoCo&#xff1a;主要用于机器人学、强化学习、生物力学等领域&#xff0c;擅长处理多自由度、复杂动力学问题&#xff0c;尤其适合进行高精度的物理仿真。 Unity PhysX&#xff1a;主要用于游戏开发、虚拟现…

LeetCode:257. 二叉树的所有路径

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根…

十二月第五周python

第一个程序&#xff0c;熟悉转换器&#xff0c;把加法计算器变成exe# // 1,制作加法计算器&#xff0c; # 输入两个数字得到相加结果并输出aint(input("输入数字&#xff1a;"))#int()是把输入的内容转换成整数&#xff0c; bint(input("输入数字&#xff1a;&…

FFmpeg 的常用API

FFmpeg 的常用API 附录&#xff1a;FFmpeg库介绍 库介绍libavcodec音视频编解码核心库编码 (avcodec_send_frame, avcodec_receive_packet)。解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的解析和封装功能&#xff0c;多种多媒体封装格式&…

关于最新MySQL9.0.1版本zip自配(通用)版下载、安装、环境配置

一、下载 从MySQL官网进行下载MySQL最新版本&#xff0c;滑到页面最下面点击社区免费版&#xff0c;&#xff08;不是企业版&#xff09; 点击完成后选择自己想要下载的版本&#xff0c;选择下载zip压缩&#xff0c;不用debug和其他的东西。 下载完成后进入解压&#xff0c;注…

vulnhub靶场 Empire LupinOne

使用命令查看靶机ip,访问ip arp-scan -l 使用御剑扫描一下子域名&#xff0c;但是没有获取到什么有用的信息 这是一个Apache文档&#xff0c;没有什么用 紧接着我们尝试暴力破解&#xff0c;这里推荐使用ffuf工具暴力破解目录&#xff0c;kali自带的ffuf扫描速度贼快 参数解释…

Kubernetes# Helm工具使用

目录 概念 核心组件 Helm客户端 Tiller Chart Repository Release Helm安装 Helm使用 创建Helm Chart 定义Chart元数据 定义Template模板 定义values参数 打包和部署 Helm Chart 推送到远程仓库 Helm常用命令 概念 Helm 是一个 Kubernetes 的包管理工具&#…

Mirror网络框架-从入门到精通之Mirror简介

前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进…

Yocto 项目中的交叉编译:原理与实例

Yocto 项目是一个强大的工具集&#xff0c;它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色&#xff0c;它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…

python学opencv|读取图像(二十二)使用cv2.polylines()绘制多边形

【1】引言 前序学习进程中&#xff0c;已经掌握了使用pythonopencv绘制线段、矩形和圆形的基本操作&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十八&#xff09;使用cv2.line创造线段-CSDN博客 python学opencv|读取图像&#xff08;…

教师管理系统

大概功能&#xff1a; 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名&#xff1a;必须是中文 手机号码&#xff1a;必须是11位&#xff0c;必须是数字 效果展示&#xff1a; 代码展示&#xff1a; Teache…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段&#xff1a;定义小程序顶部、底部 tab 栏&#xff0c;用以实现页面之间的快速切换&#xff1b;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面&#xff1b; 在上面图中&#xff0c;标注了一些 tabBar …

[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)

wireshark 下载链接&#xff1a;https://pan.quark.cn/s/eab7f1e963be 提取码&#xff1a;rRAg 链接失效&#xff08;可能会被官方和谐&#xff09;可评论或私信我重发 chrome与firefox在访问https网站的时候会将密钥写入这个环境变量SSLKEYLOGFILE中&#xff0c;在wireshark…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局&#xff0c;当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem&#xff0c;跳转到最后一个tab页面时&#xff0c;会发现tab不滚动&#xff0c;手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…