摘要: spring MVC这个环境中,Spring MVC会依据controller(或者你叫它handler)中处理方法的返回值,进行解析,解析之后提供一个视图,作为响应。 标注了@Controller的处理器,实际上本质是一个POJO,你标注了@Controller,我就高看你一眼。

spring MVC这个环境中,Spring MVC会依据controller(或者你叫它handler)中处理方法的返回值,进行解析,解析之后提供一个视图,作为响应。
标注了@Controller的处理器,实际上本质是一个POJO,你标注了@Controller,我就高看你一眼。但你的形态就是一个java代码文件。
你作为一个java的土土的文件,你里面处理方法的返回值,也就是return语句,返回了一个东西。这个东西可以是String 也可以是 ModelAndView对象。这就是标注了@Controller的方法的全部工作。

接下来,Spring容器(或者说Spring MVC容器)需要接着你抛来的返回值,不管你的返回值是String还是ModelAndView,我,作为一个容器,我全都封装成ModelAndView对象。然后,我,Spring容器的一部分,视图解析器,开始工作。

视图解析器的英文名字叫做 ViewResolver,这个东西首先是Spring定义得人一个接口,具体你的Spring容器中的视图解析器有怎样的功能,取决于你为你自己的Spring容器配置了哪种具体的Spring视图解析器的实现类。

看看之前我们看过的一个图:
这个是spring mvc 的jar中的默认配置

当然你的spring项目也可以在配置文件中覆盖上述配置(我并没有用别的视图解析器取代默认的InternalResourceViewResolver):

/*** @return 登录验证*/@RequestMapping("/dologin")public ModelAndView dologin(HttpServletRequest request, User user) { User us1 = uss.getUserByName(user.getSrName()); ModelAndView mav = new ModelAndView(); mav.setViewName("forward:/login.jsp"); if (us1 == null) { mav.addObject("errorMsg", "用户名不存在"); } else if (!us1.getSrPwd().equals(user.getSrPwd())) { mav.addObject("errorMsg", "用户密码不正确"); } else { } return mav; } 

@Controller中的方法返回值最终都是ModelAndView,我们需要搞清楚两件事:
1.ModelAndView是什么?
2.视图解析器究竟做了哪些工作,才能返回我们需要的视图?

我们应该先看看ModelAndView是怎么回事:
ModelAndView是Spring中标准的类,完全是Spring自己封装的对象。Spring API中如此描述这个对象:
public class ModelAndView extends java.lang.Object

Holder for both Model and View in the web MVC framework. Note that these are entirely distinct. This class merely holds both to make it possible for a controller to return both model and view in a single return value.

Represents a model and view returned by a handler, to be resolved by a DispatcherServlet. The view can take the form of a String view name which will need to be resolved by a ViewResolver object; alternatively a View object can be specified directly. The model is a Map, allowing the use of multiple objects keyed by name.

用人话解释一下ModelAndView是干什么用的,ModelAndView包含两部分:一个View和一个Model
View由setViewName()方法来决定,决定让ViewResolver去哪里找View文件,并找到是哪个jsp文件;
Model由addObject()方法来决定,它的本质是java的HashMap,键值对;
用人话来解释ModelAndView的功能就是,View负责渲染Model,让你找到代表View的jsp,用这个jsp去渲染Model中的数据。

看看Spring源码:
Spring官网提供的API

去这个路径找一下:

也就是说ModelAndView对象中的核心成员就是Object和ModelMap
其中ModelMap也是Spring自己定义的对象。

ModelMap的本质是Java的标准容器:LinkedHashMap
属性成员我们已经搞清楚了,下面是方法成员:
setViewName()方法和addObject()方法

   public void setViewName(@Nullable String viewName){this.view = viewName;}public ModelAndView addObject(String attributeName, Object attributeValue){getModelMap().addAttribute(attributeName, attributeValue);return this; } public ModelAndView addObject(Object attributeValue) { getModelMap().addAttribute(attributeValue); return this; } public ModelMap getModelMap() { if (this.model == null) { this.model = new ModelMap(); } return this.model; } 

也就是说,ModelAndView对象没有什么神秘之处,解构一下核心就是Object\LinkedHashMap,完全是Java的标准容器(对象)。
也就是说,关键不在于ModelAndView对象,而在于“视图解析器”这个Spring容器的核心部件。

那么视图解析器怎样工作呢?
你明明知道你用的ViewResolver的实现类就是InternalResourceViewResolver,那么你应该仔细看看Spring API中这一部分的详细内容:
https://docs.spring.io/spring/docs/5.0.1.RELEASE/javadoc-api/

首先InternalResourceViewResolver extends(继承)了 UrlBasedViewResolver;
然后顺便说,把用于显示(view)的jsp文件放在WEB-INF文件夹下是一种安全的做法,这样不能通过url直接access这些jsp,只能通过Controller java类来访问它们。

于是我们继续去看UrlBasedViewResolver

我想这样一个Spring官方的API中的说明性文字已经足以解开所有疑惑:那就是ModelAndView对象的方法setViewName()中的参数,看上去像是一个普通字符串的参数,究竟应该采用哪种格式?应该怎么写?已经有了定论。

As a special feature, redirect URLs can be specified via the "redirect:" prefix. E.g.: "redirect:myAction.do" will trigger a redirect to the given URL, rather than resolution as standard view name. This is typically used for redirecting to a controller URL after finishing a form workflow.

Furthermore, forward URLs can be specified via the "forward:" prefix. E.g.: "forward:myAction.do" will trigger a forward to the given URL, rather than resolution as standard view name. This is typically used for controller URLs; it is not supposed to be used for JSP URLs - use logical view names there

转载于:https://www.cnblogs.com/zhuchuanliang/p/7784772.html

SpringMVC中ModelAndView对象与“视图解析器”相关推荐

  1. 7.SpringMVC 配置式开发-ModelAndView和视图解析器

    ModelAndView 1.Model(模型) 1.model的本质就是HashMap,向模型中添加数据,就是往HashMap中去添加数据 2.HashMap 是一个单向查找数组,单向链表数组 3. ...

  2. springmvc中的视图解析器详细配置

    视图解析器 springmvc中View Resolver负责将处理结果生成View视图,处理器执行完业务逻辑后将带有逻辑视图的ModelAndView返回给前端控制器,前端控制器再将ModelAnd ...

  3. 【SpringMVC笔记05】SpringMVC中的视图解析器

    这篇文章,主要介绍SpringMVC框架中的几种视图解析器. 目录 一.视图解析器 1.1.什么是视图解析器 1.2.InternalResourceViewResolver 1.3.UrlBased ...

  4. SpringMVC的视图解析器

    文章目录 SpringMVC的自定义视图解析器 [1] SpringMVC的视图解析器 [2] SpringMVC的自定义视图解析器 SpringMVC自定义视图解析器的使用 [1] 目前项目资源的声 ...

  5. springmvc视图解析器_SpringMVC视图及REST风格

    什么是视图解析器? springMVC用于处理视图最重要的两个接口是ViewResolver和View. ViewResolver的主要作用是把一个逻辑上的视图名称解析成一个真的的视图,而Spring ...

  6. SpringMVC 视图解析器及拦截器

    视图解析器 跳转方式(设置返回值字符串内容) ①默认请求转发 forward:资源路径,forward可省略 ②重定向 redirect:资源路径 自定义视图解析器 SpringMVC会提供默认的视图 ...

  7. SpringMvc及三大组件(适配器、映射器、视图解析器)

    文章目录 1 SpringMvc三大组件 适配器 映射器 视图解析器 1 @RequestMapping和@Controller **1. 什么是mvc** 2. SpringMvc三大组件及其作用 ...

  8. SpringMVC——视图和视图解析器

    一.概念  SpringMVC用于处理视图最重要的两个接口是ViewResolver(视图解析器)和View(视图).ViewResolver的主要作用是把一个逻辑上的视图名解析为一个真正的视图,解析 ...

  9. springmvc多个视图解析器管理跳转资源

    springmvc多个视图解析器管理跳转资源 项目结构 第一步:将所有资源交由springmvc管理 <servlet><servlet-name>springmvc</ ...

  10. Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

    SpringMVC使用细节 第一节 视图解析器 通过HelloWorld程序我们看到了handler方法的返回值表示: 请求处理完成后,请SpringMVC执行一个请求转发.转发的地址就是handle ...

最新文章

  1. html产品列表页的设计,产品列表页.html
  2. copy of an AVPacket structure
  3. POJ1787多重背包中在最优方案下输出具体的选择方案
  4. SVN -客户端URL地址修改命令
  5. 成为Web开发大师你必须知道的7件事情
  6. Linux CPU数、物理核、逻辑核的查看方法及线程进程的绑定方法
  7. 把数据保存到cook_JavaScript数据存储 Cookie篇
  8. SAP Hybris backoffice加载的zul文件和zk文件是什么东西
  9. hsqldb快速入门
  10. 【人工智能】“看透”神经网络
  11. 蓝魔i11pro运行linux,不仅仅是变大了 蓝魔i11pro新玩法
  12. JDBC(连接池) -- 02(I)
  13. 提高sql性能的方法_三种提高T-SQL性能的方法
  14. angularjs 实例_AngularJS包含示例教程
  15. VScode中使用platformIO开发,编译时找不到自己的源文件(报错信息:undefined reference to )
  16. ubuntu22.04运行qq音乐
  17. linux分区表导出与恢复,linux下磁盘分区表的备份和恢复
  18. python中的ide是什么意思_用于Python的IDE是什么?
  19. codeforces1100 F. Ivan and Burgers(线性基)
  20. chrome插件-图片放大预览-imagus

热门文章

  1. 华为系列设备优先级总结(一)
  2. mysql 5.7.17解压缩版本安装过程
  3. restfulframework引用多对多外键
  4. mongodb C++ Driver安装
  5. 中琅领跑条码打印软件如何导入CDR文件
  6. apache 网页301重定向、自定义400/403/404/500错误页面
  7. 我用微笑剪辑我的微电影 ---六月实习总结
  8. java linux和windows下文件路径间隔符的写法——解决linux下程序在windows下运行时的上传文件出错问题...
  9. SOA系列文章之(四):在Web服务中使用SOA
  10. 关于vector的两个问题(reserve方法修整过剩空间)