ModelAndView

ModelAndView

前提

首先梳理一下Spring Web MVC处理http请求的大致过程:

当http请求到来时,DispatcherServlet负责将请求进行分发。DispatcherServlet可以认为是Spring提供的前端控制器,所有的请求都要经过它来统一分发。

在DispatchServlet中有重写的doService()方法,此方法中又调用doDispatch(),doDispatch()方法调用getHandler(),在getHandler方法中使用了变量this.handlerMappings,这个变量中保存了所有@RequestMapping 和handler的映射规则。

所以请求进来后,会挨个尝试this.handleMappings中数据,看当前的handlerMappings中是否有对应的请求信息

  • 如果有就找到这个请求对应的handler
  • 如果没有就找下一个 HandlerMapping

在这里插入图片描述

当我们的请求在RequestMapping HandlerMapping 中找不到时,springboot会默认返回404页面。

如果请求存在,就会来到对应的controller层中对应的方法,对请求进行处理。

一旦controller处理完请求,则返回ModelAndView对象给DispatchServlet前端控制器。

ModelAndView中包含了Model和View,从宏观角度来讲,DispatchServlet是整个Web应用的控制器;从微观角度来讲,Controller是单个Http请求处理过程中的控制器,而ModelAndView则是http请求过程中返回的模型和视图。model是用来存储数据(model本质上是一个map对象,所以使用key-value方式存储数据),供渲染View时使用。View则是对应的页面名称,在springboot中,默认往resource下templates中查找对应的视图。

下面是具体的使用方法:

首先再controller层编写接口/index(注意此时,没有引入thyfmeleaf)

@Controller
public class IndexController {@GetMapping("/index")public ModelAndView index(){ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("index");modelAndView.addObject( "key1","1");modelAndView.addObject("key2","2");return modelAndView;}
}

然后,在templates下创建了index.html

在这里插入图片描述

然后,在前端调用此接口,结果报错

在这里插入图片描述

Hint: This may be the result of an unspecified view, due to default view name generation
-- 提示:这可能是一个未指定视图的结果,由于默认视图名称的生成

在后端debug后,是进入了controller层的对应方法的,但是最后返回前端页面报错,结合报错信息,说明是找不到定义的index.html文件。说明视图解析器没有根据传入ModelAndView中的index找到templates下的index.html.

于是,百度后发现,大部分的解决办法是引入thymeleaf模板引擎就能找到。于是,在pom文件中引入了该依赖,结果真的成功跳转了。

然后百度了thymeleaf的作用,看到一句话:

Thymeleaf的主要作用是把model中的数据渲染到html中,因此其语法主要是如何解析model中的数据

同时,可以根据Thymeleaf的配置文件类ThymeleafProperties可知,它会自动为我们配置好视图的识别路径和页面前缀,所以,我们只需要在templates文件夹下创建页面,并且设置视图名时也不用加上后缀,系统就能为我们自动补充完整,并且到对应的位置找到该资源。

在这里插入图片描述

如果想要改变相关参数,只需要在配置文件中,使用spring.thymeleaf + 变量名 :value即可

spring: thymeleaf: prefix: '''/templates/static/'' --改变资源路径suffix: ''  --改变资源后缀

在thymeleaf的帮助下,我们就能使用modelandview跳转页面,同时传递参数到页面。

至于如何在页面中获取存入modelandview的数据,就需要使用thymeleaf的语法了。这里不做详细阐述。

在这里插入图片描述

redirect和forward

  1. redirect:重定向

在这里插入图片描述
当使用redirect重定向到index时,页面的url会由redirect变成index?param=123&name=dyy
在这里插入图片描述

显然,使用redirect会改变url,相当于发送了两次请求,第一次请求url为/redirect,然后再请求/index?param=123&name=dyy

同时,我们也可以看到,重定向后,我们可以在第二个请求中获取第一个请求中的参数值,只不过,可以直接拼写在问号后面,也可以直接使用modelAndview进行添加,最终结果都是一样的。

所以,可以得出结论,当我们把数据存到modelAndview后,最后被springbMvc处理到了request的attribute中了。

但是,这样会有一个问题,就是我们的参数会暴露出来,所以,这里最好对我们添加的参数进行一个加密,提高安全性。

同时,这样也有个弊端,就是传中文可能会有乱码问题

  1. forward

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iDU73rbw-1647821568770)(C:\Users\83972\AppData\Roaming\Typora\typora-user-images\image-20220320222048213.png)]

    经过测试,这里在mv中添加的参数name,无法在/index中获取到,没有向redirect一样自动拼接在地址后面。

    所以,如果使用modelandview进行转发,在转发后的新接口中是无法获取modelandview中的model数据的。只能获取到拼接的参数。如上图,只能获取到param的值,无法获取到name的值。

当然,也可以不使用modelandview进行转发和重定向,其他方法可以把参数存入session或是attribute中,然后在新的接口中进行获取。

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

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

相关文章

SpringMVC中的Model和ModelAndView详解

原文链接: 0.前言 1.Model是什么? model是”模型“的意思,是MVC架构中的”M“部分,是用来传输数据的。 2.ModelAndView是什么? 如果翻译过来就是”模型和视图“,可以理解成MVC架构中的”M“和”V“,其…

5.1 - Web漏洞 - XSS漏洞详解

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 XSS漏洞 一、什么是XSS?二、XSS概述三、靶场练习四、XSS使用步骤五、XSS攻击类…

影响代理ip纯净度的原因及目标网站如何识别代理ip

网络上代理ip很多,但真正可以为我们所用的大部分都是付费ip,那为什么免费ip不能为我们所用呢?下面我们就纯净度和目标网站是如何识别代理ip来分析一下。 一、纯净度 ip纯净度是什么意思呢?简单一点开始就是指使用这个ip的人少&…

如果你当架构师,从0开始,如何做一个后台项目的架构?

前言 在40岁老架构师 尼恩的读者社群(50)中,很多小伙伴要拿高薪,这就要面试架构师,要完成架构的升级,进入架构赛道。 在架构师的面试过程中,常常会遇到下面的问题: 如果给你一个项目要你从0到1做架构&…

数字化艺术时代的新趋势:虚拟数字展厅的崛起

引言: 艺术与技术的融合正带领我们进入一个全新的数字化艺术时代。在这个时代中,虚拟数字展厅正在以惊人的速度崛起,并引领着展览的新趋势。 一.虚拟数字展厅的定义和特点 虚拟数字展厅是一种基于虚拟现实和全景技术的数字化艺术…

pycharm2018如何关闭自动更新提示

1.点击左上角File,如图进入Settings(或者按CtrlAlts) 2.搜索到updates选项,把Automatically check updates for(自动检查更新以…规则) 前面够选去掉即可.

两天搞定计算机专业毕业设计,附源码

两天搞定计算机专业毕业设计,附源码 适用者毕设专业 使用要求具备基本Unity 基本操作小白即可,无需编码 博主诉求快乐毕业 点赞 关注 收藏 资源说明Free资源太多了,看截图目录就知道了 适用者 毕设专业 鄙人也是计算机狗一只,会…

电脑关闭自动更新

1.winr 打开运行窗口输出services.msc,点击确定 2.在服务窗口中,我们找到Windows update选项,双击打开 3.在启动类型选择禁用 4.点击上面的恢复,在恢复选项里面,我们把第一、第二、后续失败,都改为无操作,后点击应用…

ubuntu20关闭自动更新

1、在GUI上关闭自动更新。设置-关于-软件更新-更新,能关的关,不能关的改成最低频率。 2、阻止软件更新弹窗(眼不见为净~) 打开终端执行命令: sudo chmod a-x /usr/bin/update-notifier 如果想恢复弹窗执行下面的命令…

vscode配置html页面自动刷新,Vscode关闭自动更新设置

如何关闭Vscode自动更新? 有时侯在使用Vscode时会发现自己都不知道它就自已更新了,如何关闭Vscode的自动更新呢?下面介绍一下关闭Vscode自动更新的方法步骤: 打开Vscode,点击文件》首选项》设置,在打开的设…

关闭Postman v5.0自动更新

Postman大约每1个月,就会在后台更新一次,这种更新是可以屏蔽的。 在Postman的[设置]页面 --> Update —> Disable 即可,如图(1)所示。 图(1) 设置自动更新为Disabled 需要说明的是,此操作只对Postman v5.0以下的版本有效&am…

Chrome浏览器如何关闭自动更新

首先是【右键计算机->管理】,在【计算机管理(本地)->系统工具->任务计划程序->任务计划程序库】中找到两个和Google自动更新相关的任务计划【GoogleUpdateTaskMachineCore】与【GoogleUpdateTaskMachineUA】,并把它俩禁用掉。印象中介绍这方…

Windows Server 2016关闭自动更新

场景描述 平时使用系统时总提示需要更新系统,而更新系统后发现有些功能会出现新的异常,故而关闭自动更新的需求产生,这里介绍如何再Windos server 2016中关闭自动更新~ 解决方法 Step 1:进入cmd,之后输入sconfig St…

eclipse如何关闭自动更新

一、问题描述 eclipse如何关闭自动更新 二、解决方法 1. Window --> Preferences --> General --> Startup and Shutdown -->在列表项里面找到"Automatic Updates Scheduler " 项去掉前面的勾 2. Window --> Preferences --> Myeclips…

windows10 关闭自动更新

暂停自动更新 打开Windows更新的高级选项 win10专业版即以上关闭自动更新 Windows10专业版及其以上版本的操作系统可以使用组策略编辑器,可以在组策略编辑器中配置Windows更新。首先按下winR,在命令窗口中输入“gpedit.msc”,打开组策略编辑…

Chrome浏览器关闭自动更新

背景是: 在用Python抓取的时候,经常会遇到Chrome浏览器版本和Chromedriver版本不一致的情况,为此有必要关闭Chrome的自动更新功能。 1、在Windows电脑桌面上,右键点击“此电脑” -》选择“管理”,弹出下面:…

Intellig idea关闭自动更新

idea关闭自动更新 idea是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 IDEA是…

如何关闭电脑自动更新?

方法一 步骤1.电脑左下角有一个【开始】图标,右键它后点击“运行”; 步骤2.在弹出的运行界面里的框内输入services.msc后点击确定或者抨击键盘的回车键,随后在弹出的界面我们需要找到并双击“Windows Update”; 步骤3.在弹出的界…

怎么关闭服务器系统自动更新,自动更新怎么关闭 如何关闭window自动更新提高运行速度...

我们知道安装的系统默认是开启系统自动更新的。对于绝多数个人用户甚至企业用户来说windows自带的自动更新功能并不实用,经常会自动下载系统内部一些补丁程序并安装,造成过多系统垃圾,甚至造成系统出错,影响系统稳定与速度。因此我…

腾讯会议关闭自动更新

20221009 可以用 转载于PC端腾讯会议怎么关闭自动更新? - 知乎用户的回答 - 知乎,如有侵权可联系删除 需要下载火绒,此方法仅限于Windows., 不想安装或者没有可以跳过 首先, 新建一个文本文档, 扩展名重命名为.json, 将代码段的内容粘贴进去…