springmvc如何使用视图解析器_SpringMVC框架(五)

v2-55db4d67b45f0a3334d26610e2a1708d_1440w.jpg?source=172ae18b

>>>学习交流群< < <有志者,事竟成

【SpringMVC框架】

五、SpringMVC的自定义试图解析器

1. SpringMVC的视图解析器(面试)

问题:

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

解决:

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

实现:

视图解析器

本质:

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

内容:

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

代码示例:

v2-7fc921799936d6526b279d8d339faacf_b.jpg

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

作用:

该解析器是SpringMVC官方提供的,支持部分参数自定义。它会在接收到单元方法的返回值后,给单元方法的返回值增加一个前缀和后缀常量,然后将拼接的返回值作为请求转发的资源的路径。

使用:

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

注意:

自定义视图解析器在SpringMVC.xml文件中配置好后,在单元方法中的返回值不要带有任何的关键字才会触发,如果我们单元方法的返回值带有forwrd:或者redirect:关键字则底层会使用ModelAndView来完成返回值的资源解析。并且自定义的视图解析器只做资源的请求转发。

代码示例:

SpringMVC.xml的配置

<?xml version="1.0" encoding="UTF-8"?>

测试单元方法示例代码:

@RequestMapping

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

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

问题:

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

解决:

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

实现方案:

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

项目密室:

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

v2-0e3399156cf0e856d31ffc924001d735_b.jpg

代码示例:

v2-1987f1a4051fc4596754faaa50dcfec1_b.jpg

v2-f56e919783a045e77ff223c7ab1e79e6_b.jpg

v2-8efa102b009cb83abcd05082a3779c8c_b.jpg

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

问题:

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

解决:

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

示例:

SpringMVC.xm中配置自定义视图解析器

v2-c28a6d0e7f1609fa48de19d5b72ccb85_b.png

声明单元方法请求转发,注意:返回值直接为资源名

v2-93bdaf04e15e31ef3f17d79838f0a6b6_b.jpg

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

问题:

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

解决:

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

实现:

使用restful完成

示例:

v2-4c42ee9e437e04a4cffb10cd69d2c441_b.jpg

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

v2-0da3d46c43d88a224c6aaab06af9492a_b.png

有疑问的不懂的,欢迎到评论区留言~

需要学习资料的可以进群

>>>学习交流群< < <课件,视频,项目,源码,你想要的这里都有

风里雨里,我们等你~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值