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

2021/10/7 9:11:21

本文主要是介绍day06-1-springmvc中视图类型和源码调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 2019年6月18日 - day06 - 上午 - 开始
  • 18 - 回顾
  • 19 - View视图类型
    • 调试view源码
    • 三种view
    • RedirectView
  • 20 - 各种View源码调试
    • 写笔记
    • 调试InternalResourceView
    • 调试RedirectView
    • mvc:view-controller标签

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

image-20211006234655787

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视图类型

image-20211007002201462

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

image-20211007002644191

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

image-20211007002930384

image-20211007002822664

image-20211007003150276

调试view源码

image-20211007004233066

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

image-20211007004448952

可以看到view的值是JstlView

image-20211007004706822

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

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

image-20211007004957521

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

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

image-20211007005305175

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

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

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

image-20211007005511440

我们可以看到JstlView extends InternalResourceView

三种view

今天我们会说到3种view。

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

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

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

RedirectView

image-20211007005843614

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

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

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

image-20211007010037719

20 - 各种View源码调试

写笔记

image-20211007010600915

调试InternalResourceView

我们控制层的方法是:

image-20211007012302660

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

image-20211007010849247

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

image-20211007011150520

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

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

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

image-20211007011519610

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

image-20211007011921127

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

image-20211007012547866

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

image-20211007012807990

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

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

image-20211007013023058

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

image-20211007013210353

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

image-20211007013433403

调试RedirectView

控制层方法调整代码为:

image-20211007014027604

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

image-20211007013947322

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

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

image-20211007014352701

image-20211007014627555

image-20211007014758435

step into这个renderMergedOutputModel方法。

image-20211007015156417

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

image-20211007015346063

mvc:view-controller标签

image-20211007015501094

这个东西不用,忽略。



这篇关于day06-1-springmvc中视图类型和源码调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程