SpringMvc框架(视图和视图解析器)

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

SpringMvc知识

第一篇---->SpringMvc初识|MVC|三层架构
第二篇---->IoC容器上下文和映射请求上下文
第三篇---->熟悉基本开发流程
第四篇---->接收各类请求参数的方式
第五篇---->获取请求中的Request,Session,Cookie等对象属性
第六篇---->拦截器开发
第七篇---->视图和视图解析器
第八篇---->数据校验
第九篇---->文件上传方式
第十篇---->数据转换和数据格式化

视图和视图解析器

1 模型数据

1.1 介绍

  • 视图是业务处理后展现给用户的内容,一般情况下,都会在业务处理方法中返回一些数据,这些数据将回显到页面中,供用户查看。在之前谈SpringMvc开发流程的时候,说到控制器获取数据后,会将数据装配到模型数据和视图中,然后将视图名称转发到视图解析器中,通过解析器后得到最终视图,最后将数据模型渲染到视图中,展示最终结果给用户。
  • SpringMvc提供了以下几种途径输出模型数据
      1)ModelAndView:处理方法返回值类型为ModelAndView时,方法中可以通过该对象添加模型数据
      2)Map或者Model:在处理方法中可以创建对应的Model或者Map对象,用来保存对应的数据,最后将Map或者Model返回即可
      3)@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
      4)@ModelAttribute:方法形参标注该注解后,行藏的对象就会放到数据模型中。

1.2 ModelAndView

  • 控制器处理方法的返回值如果是ModelAndView,则其既包含视图信息也包含模型数据信息
  • 添加模型数据的方式
      1)ModelAndView addObject(String attributeName, Object attributeValue):设置属性名和属性值
      2)ModelAndView addAllObjects(Map<String, ?> modelMap):如果有多个属性需要传递,可以先保存在一个Map集合中,然后直接传递一个Map集合,达到实现传递多个属性的效果
  • 设置视图的方式
      1)void setViewName(String viewName):传递一个视图名称,DisPatcherServlet会根据该视图名称结合视图解析器进行解析
      2)void setView(View view):传递一个View类型的对象,
  • 示例
      1) 创建处理器方法
      在这里插入图片描述
      2)在页面中回显模型数据
      在这里插入图片描述
      在这里插入图片描述

1.3 Model,Map

  • SpringMvc在内部使用了一个Model接口存储模型数据
  • 具体步骤:
      1)SpringMvc在调用方法前会调用一个隐含的模型对象作为模型数据的存储对象
      2)如果方法的形参是Map或者Model类,SpringMvc会将隐含类型的引用传递给这些形参。在方法体内,可以通过这个形参对象访问到模型数据中所有数据,也可以向模型中添加新的属性数据。
  • 示例
      在这里插入图片描述
      在这里插入图片描述

1.4 @SessionAttributes

  • 这个在第五篇里面已经提到过了,所以不重复了

1.5 @ModelAttribute

  • PS:这一部分内容转载自–》@ModelAttribute使用,并做适当修改
  • @ModelAttribute注解的使用位置
      1)应用在方法上
      2)应用在方法的参数上
      3)应用在方法上,并且方法也使用了@RequestMapping
  1. 应用在方法上
  • 被@ModelAttribute注解的方法会在当前Controller每个方法执行之前都执行,因此对于一个Controller中包含多个URL的时候,要谨慎使用。
  • 1)使用@ModelAttribute注解无返回值的方法
      在这里插入图片描述
      说明:当访问/view/test的时候,首先会执行myModel方法,在该方法内,会接受请求中传递的参数,并且使用一个Model对象,将str值保存起来,然后会执行test方法,然后跳转到success.jsp页面中,此时Model对象也会被传递过来,在页面中也可以获取到Model中的值
      如果把myModel和test方法合二为一,就是下面的样子:
      在这里插入图片描述
  • 2)使用@ModelAttribute注解有返回值的方法
      在这里插入图片描述
      在这里插入图片描述
      在这种情况下,返回值对象被默认放到隐含的Model中,在Model中的key为返回值首字母小写,value为返回的值。如果对于key的默认取值不满意,可以使用@ModelAttribute(value=“xxx”)来改变key的值
      上面的情况等同于下面这个形式:
      在这里插入图片描述
      现在我们启动测试,看看能否在页面中获取到值
      在这里插入图片描述
  1. 应用在方法的参数上
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      从演示效果来看,使用@ModelAttribute注解的参数,会从前面@ModelAttribute注解的方法中给Model传入的参数中寻找对应属性并传入
      这里强调一个@SessionAttributes的使用,因为和@ModelAttribute注解有关系
      在这里插入图片描述
  2. 应用在方法上,并且方法也使用了@RequestMapping
      在这里插入图片描述
      这种情况下,返回值String(或者其他对象)就不再是视图了,而是放入到Model中的值,此时对应的页面就是@RequestMapping中的值test
      如果类上有@RequestMapping,则视图路径还要加上类的@RequestMapping值,上面例子中视图路径为view/test.jsp

2 视图和视图解析器

2.1 引入

  • 视图是展示给用户的内容。在此之前,需要通过控制器得到对应的数据模型,如果是非逻辑视图,则不会经过视图解析器定位视图,而是直接将数据模型渲染就结束了;而逻辑视图则要对其进一步解析,以定位真实视图,这就是视图解析器的作用。而视图则是把从控制器查询回来的数据模型进行渲染,以显示给请求者查看。

2.2 视图

  • 在向控制器发起请求之后,SpringMvc控制器获取到了对应的数据,绑定到数据模型中,那么视图就可以展示数据模型的信息了。
  • 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的 处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图
  • 为了满足各种需求,SpringMvc中定义了多种视图,只是常用的不多,有几个而已。
  • 下面来看一下核心接口View的源码
      在这里插入图片描述
  • 里面的getContentType方法和render方法很重要。getContentType表示返回一个字符串,标明给用户什么类型的文件响应,可以是HTML,json,PDF等,而render方法则是一个渲染视图的方法,通过它就可以渲染视图了。其中,Model是其模型数据,HTTP请求对象和响应对象用于处理HTTP请求的各类问题。
  • 当控制器返回ModelAndView的时候,视图解析器就会解析它,然后将模型数据传递给render方法,这样就能够渲染视图了。SpringMvc中实现视图的类有很多,比如Jstl视图JstlView,Json视图MappingJackson2JsonView等等,通过这些具体视图的render方法,SpringMvc就可以将模型数据渲染称为各类视图,来满足各种需求。
  • 下图为SpringMvc主要视图类的结构图
      在这里插入图片描述
  • 这只是画了一部分比较常用的,最常用的是JstlView,InternalResourceView和MappingJackson2JSONView等这几种。并且JstlView和InternalResourceView是父子关系,可以看成一类,主要是为jsp的渲染服务的,可以使用jstl标签库,也可以使用SpringMvc提供的标签库。
  • 视图又分为逻辑视图和非逻辑视图。比如MappingJackson2JsonView是一个非逻辑视图,它的目的就是将数据模型转换为一个JSON视图,展现给用户,无需对视图名字再进行下一步的解析。下面来看个示例
      在使用的时候需要额外添加Jackson的jar包,资料:链接:https://pan.baidu.com/s/1mz_Kp1kd70kvzuONHdQ3qw 提取码:fvk9
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 通过ModelAndView中的setView方法可以指定具体的视图类型,由于设置的MappingJackson2JsonView视图是非逻辑视图,所以在没有视图解析器的情况下也可以进行渲染,最终将绑定的模型数据转换为Json数据
  • 下面来看一个逻辑视图InternalResourceView,对于逻辑视图而言,必须要要一个视图解析器,下面是我的项目中使用的视图解析器,配置在springmvc.xml中
      在这里插入图片描述
  • 上面是使用配置文件xml的形式来配置,其实使用Java代码配置也可以,但是我个人不常用,二者殊途同归,都是要创建一个视图解析器,通过前缀和后缀加上视图名称就能找到对应的Jsp文件,然后把模型数据渲染到jsp文件中,这样便能展现视图给用户了。
  • 了解了大概解析过程,现在开始研究一下视图解析器了,不了解它,那就没法深刻理解具体视图是怎么做关联对应的。

2.3 视图解析器

  • 对于非逻辑视图而言是不需要用视图解析器进行解析的,比如MappingJackson2JsonView,它的含义就是把当前数据模型转换为json,并不需要对视图逻辑名称进行转换。但是对于逻辑视图而言把视图名称转换成逻辑视图则是必备过程,InternalResourceView就是这样一个视图。在配置文件中配置它以后就会加载到SpringMvc的视图解析器列表中,当返回ModelAndView的时候,SpringMvc就会在视图解析器列表中查找,找到对应的视图解析器进行解析视图。
  • 先看一下视图解析器顶层接口ViewResolver的源码
      在这里插入图片描述
  • 是不是很简单哈哈,这里面只有一个对视图进行解析的方法resolveViewName的定义,里面的参数有两个,viewName表示视图名称,locale用于国际化,这也说明了SpringMvc是支持国际化的。
  • 下面来看一下SpringMvc中配置的视图解析器的主要结构图
      在这里插入图片描述
  • 上图中描述了SpringMvc自带的一部分视图解析器,它能够解析各种各样需要逻辑视图名称。之前都是默认配置了InternalResourceViewResolver的,但是可以发现控制器中处理方法中有时并没有返回一个ModelAndView,而是直接返回一个字符串,它也可以渲染视图,因为底层视图解析器生成了对应的视图。
      在这里插入图片描述
  • 对于上面的代码,因为配置了InternalResourceViewR额搜绿二,通过springMvc的作用,它能够生成JstlView视图。系统也会绑定视图和模型数据到一个ModelAndView中,然后视图解析器根据视图的名称,找到对应的视图资源,这就是视图解析器的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值