SpringMVC的视图解析器

文章目录

    • SpringMVC的自定义视图解析器
        • [1] SpringMVC的视图解析器
        • [2] SpringMVC的自定义视图解析器
    • SpringMVC自定义视图解析器的使用
        • [1] 目前项目资源的声明位置和访问中存在的问题
        • [2] 使用自定义视图解析器优化资源跳转路径
        • [3] 使用restful声明公共单元方法请求转发WEB-INF下的资源

SpringMVC的自定义视图解析器

[1] SpringMVC的视图解析器

问题:

我们在使用了SpringMVC后,对于请求的处理由以前我们自己声明
Servlet处理,变为声明单元方法来处理。请求处理完成之后,需要将
处理结果响应给浏览器 ,响应方式有直接响应,请求转发,重定向。对于
请求转发和重定向,我们在单元方法中是通过返回值来告诉 DispatcherServlet如何进行此次请求的响应。而方法的返回值只有一个,所 以,我们就需要在返回值值中声明指定的关键字,让DispatcherServlet可以
通过关键字来区分是请求转发还是重定向,那么DispactherServlet底层是
如何来实现请求转发和重定向的区分的呢?

解决:

在DispatcherServlet的底层,增加逻辑代码,根据单元方法的返回值
将其返回值中的forward或者redirect关键字拆分出来,然后根据关键字
以及资源路径,最终完成资源的请求转发或者重定向。而这段逻辑代码
就是根据单元方法的返回值来完成最终的资源的处理,为了让Dispatcher
Servlet的代码结构层次更加清晰,我们可以将这段逻辑代码专门封装
起来,然后在DispatcherServlet中进行调用即可。也就意味着单元方法的
返回值被DispatcherServlet接收后,作为实参传递给了这段封装好的逻辑
代码。

实现:

视图解析器

本质:

视图解析器就是SpringMVC官方封装好的,根据单元方法的返回值
完成对应的请求转发或者重定向的对象。由DisatcherServlet来调用。

内容:

InternalResourceView:请求转发
RedirectView:重定向
ModelAndView:请求转发和重定向

代码示例:
在这里插入图片描述

[2] SpringMVC的自定义视图解析器

问题:

目前我们在SpringMVC的响应中,虽然我们直接在单元方法中返回字符串数据来
表明请求转发或者重定向的资源,但是DispatcherServlet的底层默认使用 ModelAndView来完成视图资源的解析和跳转。但是ModelAndView这个视图 解析器比较死板,ModelAndView会将单元方法返回的字符串,根据关键拆分后
来完成资源的跳转,比如:”forward:/index.jsp”,那么ModelAndView就会直接
请求转发index.jsp资源。但是我们在实际生产环境中往往会有很多特殊的需求,
这样ModelAndView就无法满足了,比如,我们在项目下创建一个a文件夹,在
a文件夹下创建b子文件夹,在b下创建一个c子文件夹,然后将项目的页面资 源全部放到c文件夹下,这样我们如果在单元方法中请求转发c文件夹中的资源,
返回值路径就会很麻烦:
”forward:/a/b/c/index.jsp”
”forward:/a/b/c/page.jsp”
“forward:/a/b/c/sel.jsp”…
而且后期一旦资源路径的文件夹名字发生变更,修改起来也会非常的麻烦。

解决:

使用自定义视图解析器,而我们自定义的视图解析器除了可以让我们根据需求
配置一些路径上的常量参数以外,还需具备ModelAndView的逻辑。所以,
我们自己需要从头创建一个新的视图解析器,在我们自己创建的视图解析器中
声明ModelAndView中的原有逻辑代码,以及我们自己需要的部分常量参数。
但是ModelAndView的逻辑我们是不知道的,那么能不能让SpringMVC官方
提供一个支持部分数据自定义的视图解析器呢,答案是可以的。我们可以通过配置 文件来配置一些我们在视图解析器中的常量数据。

实现:

  InternalResourceViewResolver

概念:

因为InternalResourceViewResolver可以让我们通过配置文件来设置一些常量
参数,所以我们将该视图解析器称为自定义视图解析器。

使用:

  1. 在springmvc.xml文件中进行配置
  2. 在单元方法中按照指定的格式返回资源路径

代码示例:
SpringMVC.xml的配置
在这里插入图片描述

测试单元方法示例代码:
在这里插入图片描述

SpringMVC自定义视图解析器的使用

[1] 目前项目资源的声明位置和访问中存在的问题

问题:

目前我们在完成功能开发时,会将项目相关的页面资源及静态资源直接声明
在web目录下,或者web目录下的子文件夹中。而web目录及其声明的子
目录中的资源,在浏览器中是可以直接被访问到的。也就是说,只要我们知道
某个资源的URL地址,在浏览器中是可以直接发起请求访问该资源的,极不安全。

解决:

假如有一天你变得很有钱,为了将钱进行保值,你就将钱都买成了古董。我们将
买的古董放在家里的客厅里面,但是我们的朋友只要知道家里的地址,就可以过来
把玩古董。后来因为客厅的古董实在是太多了,于是呢,我们将古董放在了厢房中
一部分。而厢房我们也是对外开放的,也就说朋友来了,可以直接进入厢房来把玩。
但是对于一些非常重要的古董,我们希望不能直接对外进行开放,将它们给隐藏
起来。这样有朋友来了,我们可以根据这位朋友的人品,来决定是否让他来欣赏
重要的古董。如果我们觉得不靠谱,就算朋友知道我们有该古董,但是我们仍然是
可以拒绝的,说我没有这个东东。假如靠谱,我们可以将古董从密室中拿出来给
朋友欣赏。也就是说,我们放在密室中的古董,我们自己是可以把控这些古董的访 问权限的。而客厅和厢房中的我们无法把控,因为只要朋友来了就可以直接访问。

实现方案:

在我们的web项目中造一间密室,将重要的资源放到密室中。而密室是对外不开 放的,也就说密室中的资源必须通过tomcat服务器的内部转发才能进行访问。就 算浏览器听说项目有这样密室,并且密室中也有浏览器想要的资源,浏览器发起的 请求地址是正确的,但是我们可以在服务器端死不承认,我们没有这个资源,在后 台给浏览器响应404.如果是我们觉得靠谱的请求,我们就在服务器端请求转发资 源给浏览器使用。

项目密室:

其实我们的web项目在创建的时候就自动的在web目录下创建了密室,就是
WEB-INF文件夹。也就是说WEB-INF文件夹下的资源浏览器是无法直接访问
的,必须通过内部请求转发才能访问。
在这里插入图片描述

代码示例:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[2] 使用自定义视图解析器优化资源跳转路径

问题:

我们在将重要的项目资源放在WEB-INF文件夹中后,只能通过内部的请求转发来
访问资源。如果WEB-INF下的资源较多,造成请求转发的路径书写麻烦,而且后 期一旦资源的目录发生变更,修改起来会非常的麻烦,怎么办?

解决:

我们真正想在单元方法中想写的是资源的名字,而请求转发WEB-INF下的资源路 径是公共的,每次都要写。而刚好我们的自定义视图解析器就是专门用来进行请求
转发的,而且可以设置转发资源的公共前缀和后缀信息。所以,我们可以使用自定 义视图解析器来完成WEB-INF下的资源的请求转发。

示例:
SpringMVC.xm中配置自定义视图解析器
在这里插入图片描述

声明单元方法请求转发,注意:返回值直接为资源名
在这里插入图片描述

[3] 使用restful声明公共单元方法请求转发WEB-INF下的资源

问题:

在项目中使用了自定义视图解析器后,可以在单元方法中简单的返回一个 WEB-INF下的资源的名字就可以完成资源的请求转发了,美滋滋。但是我们的资 源是非常多的,但是我们的单元方法的返回值只能有一个。总不能我们给WEB-INF
下的每个资源都声明一个对应的单元方法来完成请求转发吧,太麻烦了。

解决:

根据请求,请求转发WEB-INF下的资源的单元方法是肯定要声明的。我们可以
声明一个公共的单元方法,该单元方法不参与请求的逻辑处理,只负责根据请求
转发WEB-INF下的资源。

实现:

使用restful完成

示例:
在这里插入图片描述

[4] 重新配置springmvc.xml文件中的资源放行

在这里插入图片描述

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

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

相关文章

【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】

目录地址 前言 打错了一个地方之接60,还有输出“Peace”能拿60。还有题目坑爹害得我用了哈希,可以无视 QAQ 正题 有一个n*n的图,有m条边,不知道几个城市,给出两个位置,求两个位置移动到相遇(…

互联网级监控系统必备-时序数据库之Influxdb技术

时间序列数据库,简称时序数据库,Time Series Database,一个全新的领域,最大的特点就是每个条数据都带有Time列。 时序数据库到底能用到什么业务场景,答案是:监控系统。 Baidu一下,互联网监控系…

存放80000000学生成绩的集合,怎么统计平均分性能高

大家好,我是雄雄,好久不介绍一下我,就被大家淡忘了……我们都知道,遍历集合的方式最常用的有两种,一种是使用下标的方式遍历,第二种便是使用foreach遍历,代码分别如下:使用下标的方法…

数组元素的默认值

数组元素的默认值 数组元素是整型:0 数组元素是浮点型:0.0 数组元素是char型:0或’\u0000’,而非’0’ 数组元素是boolean型:false 数组元素是引用数据类型:null eg 非数组元素必须初始化后才能进行使用…

ssl初一组周六模拟赛【2018.3.10】

前言 先说一下成绩(因某人要求去掉了某人): 姓名成绩xjq280wyc200(本人)lrz200zyc100hjq40lw30hzb0 正题 题目1:Clocest (ssl2574) 贪心30分,改后100分dfs 链接: http://blog.c…

如何重构箭头型代码

转载自 如何重构"箭头型"代码 本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论,在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我…

SpringMVC的上传与下载

文章目录SpringMVC的上传SpringMVC的下载SpringMVC的上传 [1] 上传的功能需求 随着我们互联网的发展,我们的用户从直接访问网站获取信息。变为希望将自己本地的 资源发送给服务器,让服务器提供给其他人使用或者查看。还有部分的用户希望可以将 本地的资…

中秋节支付宝口令红包解析

大家好,我是雄雄。继上篇文章(10.1日)发完之后就没有再日更公众号了,给自己也放几天假。这个假期实在是太太太长了,放的我都心气憔悴!出去玩吧,没地儿去,在家吧,除了看书…

asp.net core高级应用:TagHelper+Form

上一篇博客《asp.net core新特性(1):TagHelper》我讲解了TagHelper的基本用法和自定义标签的生成,那么我就趁热打铁,和大家分享一下TagHelper的高级用法~~,大家也可以在我的博客下随意留言。对于初步接触asp.net core的骚年可以看看我对TagHe…

爸妈没多大本事……

本文原创:王晓丹世界上什么都不公平,唯独时间最公平,你是懒惰还是勤奋,时间都会给出结果。每个人都是孤独的,你的人生不会辜负你的。那些流下的泪和那些辛苦的汗水 全都让你成为一个独一无二的自己。把懒惰放一边 &…

我终于搞清楚了和String有关的那点事儿

转载自 我终于搞清楚了和String有关的那点事儿 String,是Java中除了基本数据类型以外,最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对&#xff1a…

SpringMVC的拦截器

文章目录SpringMVC的拦截器学习SpringMVC的拦截器学习 [1] SpringMVC拦截器的介绍 问题: 在之前学习Servlet的时候,我们学习了过滤器的知识。过滤器的作用是保护 请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围&#xff…

考研英语二大纲22年考研

全国硕士研究生招生考试英语(二)考试大纲(非英语专业)(2022年版)   I.考试性质   英语(一)考试是为高等学校和科研院所招收硕士研究生而设置的具有选拔性质的全国统一入学考试科目,其目的是科学、公平、有效地测试考生对英语语言的运用能力,评价的标…

ssl1763-观光旅游【最小环,Floyd,dijkstra】

正题 就是给出一个无向图&#xff0c;求最小环。 输入输出&#xff08;需要自取&#xff09; Input 每组数据的第一行包含两个正整数&#xff1a;十字路口的个数N(N<100)&#xff0c;另一个是道路的 数目M(M<10000)。接下来的每一行描述一条路&#xff1a;每一行有三个…

物联网模式下的多活数据中心架构认识与实践

做互联网应用很重要的一点是要保证服务可用性&#xff0c;特别是某些业务更是需要7*24小时不间断的对外提供服务&#xff0c;任何停机、宕机都会引起大面积的用户不满。持续可用性是把业务服务化时一个需要考虑的重要指标&#xff0c;很多时候我们都会牺牲一些功能来换取可用性…

subList?? subString???

今天看到了java中List中有个subList方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。1String类的subStringString中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串&am…

互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

上篇博文中&#xff0c;我们介绍了做互联网级监控系统的必备-Influxdb的关键特性、数据读写、应用场景&#xff1a;互联网级监控系统必备-时序数据库之Influxdb 本文中&#xff0c;我们介绍Influxdb数据库集群的搭建&#xff0c;同时分享一下我们使用集群遇到的坑&#xff01;…

考研数学二大纲22年考研

考试科目&#xff1a;高等数学、线性代数   考试形式和试卷结构   一、试卷满分及考试时间   试卷满分为150分&#xff0c;考试时间为180分钟.   二、答题方式   答题方式为闭卷、笔试.   三、试卷内容结构   高等教学 约80%   线性代数 约20%   四、试卷题…

ssl1500-最短路上的统计【Floyd】

正题 个无向图上&#xff0c;没有自环&#xff0c;所有边的权值均为1&#xff0c;对于一个点对&#xff08;a,b&#xff09;,我们要把所有a与b之间所有最短路上的点的总个数输出。 输入输出&#xff08;需要自取&#xff09; Input 第一行n,m,表示n个点&#xff0c;m条边 接…