day06-1-springmvc中视图类型和源码调试

目录

2019年6月18日 - day06 - 上午 - 开始

day06-1-springmvc中视图类型和源码调试

18 - 回顾

  • 核心控制器:dispatcherServlet配置在web.xml当中,会加载springmvc的配置文件,springmvc配置文件的默认位置是WEB-INF,默认名称是【servlet-name】-servlet.xml
  • springmvc配置文件:第一个是扫描组件,第二个是配置视图解析器,里面有前缀和后缀。
  • 写控制层,加@Controller注解,写方法就是处理请求的方法。
  • 方法上加@RequestMapping注解,方法返回值可以写string,返回视图名称。
  • 处理请求的方法一般做三个操作:获取客户端数据,作用域放值,页面跳转。
  • 获取客户端数据
    • 第一种方式,形参位置的参数名和客户端数据的属性名一样。
    • 第二种方式,实体类对象,实体类对象的属性和数据的属性名一样。
    • 第三种方式,形参位置植入原生servlet的api
  • 如何往客户端中放值
    • ModelAndView.addObject(key,value),setViewName设置视图名称
    • Model.addAttribute(key,value), return "string"
    • Map.put(key,value), return "string"
  • 实现页面跳转
    • return "string"
    • ModelAndView
    • request和response(servlet的原生API)
  • @RequestMapping的属性:可以用在类上,也可以用在方法上。
    • value="请求路径"
      • ant路径(问号,一个星号,两个星号)
      • 占位符、@PathVariable("id")
    • method=RequestMethod.POST
      • 设置当前请求的请求方式必须为X。
    • params:设置参数的约束性,字符串类型的数组,支持{!username}等表达式。
    • header:设置请求头的约束性,字符串类型的数组。
  • RESTful
    • HiddenHttpMethodFilter:过滤器,_method参数。
    • GET查询,POST添加,PUT修改,DELETE删除。
  • 处理请求数据@RequestParam
    • value:自定义映射关系
    • required:是否必须。
    • defaultValue:默认值。
  • @RequestHeader
    • value
    • required
    • defaultValue
  • @CookieValie
    • value
    • required
    • defaultValue

19 - View视图类型

day06-1-springmvc中视图类型和源码调试

  • jsp展示普通信息
  • 有jstl的页面,就是循环作用域当中的集合,循环展示。

day06-1-springmvc中视图类型和源码调试

  • view这个接口下面,只有一个实现类,就是AbstractView。

day06-1-springmvc中视图类型和源码调试

day06-1-springmvc中视图类型和源码调试

day06-1-springmvc中视图类型和源码调试

调试view源码

day06-1-springmvc中视图类型和源码调试

在这一步,我们step over执行下一步,然后看一下view的值。

day06-1-springmvc中视图类型和源码调试

可以看到view的值是JstlView

day06-1-springmvc中视图类型和源码调试

我们的项目中有这几个jar包,我们先把这几个jar包删除一下,然后重新debug。

当我们删除了这几个jar包之后,重新执行上面的步骤,看到下面的view的值:

day06-1-springmvc中视图类型和源码调试

我们看到view的值是:InternalResourceView,这叫做网络资源视图

view在执行过程中,各种类型的view,只有在下面的步骤获得view的时候,才会产生不同的类型:

day06-1-springmvc中视图类型和源码调试

在上面的这一步中,获得视图对象的时候,会根据我们的需求,获得不同的view对象。

现在我没有什么需求,普通情况下,获得的是InternalResourceView

如果我的项目当中加上jstl的标签,那么这里获得的是JstlView

day06-1-springmvc中视图类型和源码调试

我们可以看到JstlView extends InternalResourceView

三种view

今天我们会说到3种view。

第一种叫做InternalResouceView,这就叫做转发视图

第二种叫做JstlView,这个也是转发视图,支持页面当中的jstl。

第三种叫做RedirectView,这个就是重定向视图

RedirectView

day06-1-springmvc中视图类型和源码调试

return “string”,string前面什么都不加,这就是转发,加上redirect,就是重定向。

修改控制层代码,然后重新开始debug。

重复执行上面的步骤,我们看到在view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);之后,view的值是RedirectView

day06-1-springmvc中视图类型和源码调试

20 - 各种View源码调试

写笔记

day06-1-springmvc中视图类型和源码调试

调试InternalResourceView

我们控制层的方法是:

day06-1-springmvc中视图类型和源码调试

开启debug,重复上面的过程,找到resolveViewName位置。

day06-1-springmvc中视图类型和源码调试

断点走到这里的时候,我们step into和step return两次,第三次step into才会真正进入到resolveViewName方法中。

day06-1-springmvc中视图类型和源码调试

我们从上图可以看到viewResolvers是视图解析器,是一个数组,说明我们可以在web.xml当中配置多个视图解析器。

但是一般情况下,我们也是只配置一个视图解析器的。

我们可以看到this.viewResolvers的元素是InternalResourceViewResolver

day06-1-springmvc中视图类型和源码调试

进入之后我们看到下面的图:

day06-1-springmvc中视图类型和源码调试

进入到createView()方法中,去看一下子类是否能够创建view对象。

day06-1-springmvc中视图类型和源码调试

然后我们进入super.createView()方法。

day06-1-springmvc中视图类型和源码调试

可以看到,在父类当中,是调用了loadView方法。

然后我们继续step into这个loadView方法。

day06-1-springmvc中视图类型和源码调试

我们继续进入到buildView方法中,看看到底是什么内容:

day06-1-springmvc中视图类型和源码调试

我们继续step into进入super.buildView方法内部。

day06-1-springmvc中视图类型和源码调试

调试RedirectView

控制层方法调整代码为:

day06-1-springmvc中视图类型和源码调试

重复上面的调试过程,然后可以看到走到下面的判断条件:

day06-1-springmvc中视图类型和源码调试

我们看到上面图中的代码:String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());这句话是将视图名称当中的redirect:这一段给截取掉了,只剩下了/index.jsp赋值给了redirectUrl

然后不断step over,找到了创建view的位置:

day06-1-springmvc中视图类型和源码调试

day06-1-springmvc中视图类型和源码调试

day06-1-springmvc中视图类型和源码调试

step into这个renderMergedOutputModel方法。

day06-1-springmvc中视图类型和源码调试

我们step into进入到sendRedirect方法内部:

day06-1-springmvc中视图类型和源码调试

mvc:view-controller标签

day06-1-springmvc中视图类型和源码调试

这个东西不用,忽略。

上一篇:欧拉方法解决微分方程初值问题


下一篇:Spring Boot 2.x 实战--第一个Spring Boot程序