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

news2025/1/2 22:54:22

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. 路径匹配规则

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

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

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

相关文章

CyclicBarrier线程辅助类的简单使用

文章目录 简述内部机制构造函数使用案例异常处理 简述 CyclicBarrier 是另一个用于协调多个线程之间操作的同步辅助类&#xff0c;它允许一组线程互相等待彼此到达一个共同的屏障点&#xff08;barrier&#xff09;。与 CountDownLatch 不同的是&#xff0c;CyclicBarrier 可以…

B站推荐模型数据流的一致性架构

01 背景 推荐系统的模型&#xff0c;通过学习用户历史行为来达到个性化精准推荐的目的&#xff0c;因此模型训练依赖的样本数据&#xff0c;需要包括用户特征、服务端推荐的视频特征&#xff0c;以及用户在推荐视频上是否有一系列的消费行为。 推荐模型数据流&#xff0c;即为…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

尔湾市圣诞节文化交流会成功举办,展示多元文化魅力

洛杉矶——12月21日,圣诞节文化交流会在尔湾成功举办。圣诞节文化交流会旨在促进不同文化之间的交流与理解。通过举办舞蹈表演、演讲和互动游戏等,为参与者提供了一个展示和欣赏多元文化艺术的平台。这些活动不仅增加了社区成员之间的互动,也加深了他们对不同文化传统和艺术形式…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

Spring Cloud LoadBalancer (负载均衡)

目录 什么是负载均衡 服务端负载均衡 客户端负载均衡 Spring Cloud LoadBalancer快速上手 启动多个product-service实例 测试负载均衡 负载均衡策略 自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB) , 是高并发, 高可用系统必不可少的关…

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容&#xff1a; 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观&#xff0c;我更建议…

HCIA-Access V2.5_7_1_XG(S)原理_系统概述

近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求&#xff0c;业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求&#xff0c;而GPON已经向10G GPON演示&#xff0c;本章将介绍1…

安装了python,环境变量也设置了,但是输入python不报错也没反应是为什么?window的锅!

目录 问题 结论总结 衍生问题 1 第1步&#xff1a;小白python安装&#xff0c;不要埋头一直点下一步&#xff01;&#xff01;&#xff01; 2 第2步&#xff1a;可以选择删了之前的&#xff0c;重新安装python 3 第3步&#xff1a;如果你不想或不能删了重装python&#…

留学生交流互动系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

计算机网络 (13)信道复用技术

前言 计算机网络中的信道复用技术是一种提高网络资源利用率的关键技术。它允许在一条物理信道上同时传输多个用户的信号&#xff0c;从而提高了信道的传输效率和带宽利用率。 一、信道复用技术的定义 信道复用&#xff08;Multiplexing&#xff09;就是在一条传输媒体上同时传输…

2236. 判断根结点是否等于子结点之和

给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和&#xff0c;返回 true &#xff0c;否则返回 false 。 示例 1&#xff1a; 输入&#xff1a;root [10,4,6] 输出&#xf…

orm03

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口&#xff0c;可供开发过程中调用和测试使用 django会搜集所有已注册的模型类&#xff0c;为这些模型类提供数据管理界面&#xff0c;供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

UE5材质节点Panner

Panner节点可以让贴图动起来&#xff0c;快捷键是P&#xff0c;Speed的数值大小就是贴图移动的快慢&#xff0c;x和y是方向 这个节点可以用来做&#xff0c;传送带&#xff0c;护盾&#xff0c;河流&#xff0c;岩浆&#xff0c;瀑布等 制作岩浆流动效果 创建材质&#xff0c;…

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo 前言摘要引言Task 相关工作方法SDM-UniPS预处理尺度不变的空间光特征编码器像素采样变压器的非局部交互 PS-Mix数据集 实验结果训练细节评估和时间&#xff1a; 消融实验定向照明下的评估没有对…

道路倒角 三角网 两侧偏移

public void 多段线和直线两侧缓冲区(){List<Curve> ents1 Z.db.SelectEntities<Curve>();List<Polyline> ents Z.db.CurvesToPolyLines2(ents1);//Z.db.SelectEntities<Polyline>();double offsetDistance 5.0;//p距离double offsetDistance2 1.0…

贪心算法(常见贪心模型)

常见贪心模型 简单排序模型 最小化战斗力差距 题目分析&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e5 10;int n; int a[N];int main() {// 请在此输入您的代码cin >> n;for (int i 1;i < n;i) cin >> a[i];sort(a1,a1n);…

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述 中描述了什么是供应链中台&#xff0c;供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解&#xff0c;我会逐一针对中台…

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…