_method
参数。在这一步,我们step over执行下一步,然后看一下view的值。
可以看到view的值是JstlView
。
我们的项目中有这几个jar包,我们先把这几个jar包删除一下,然后重新debug。
当我们删除了这几个jar包之后,重新执行上面的步骤,看到下面的view的值:
我们看到view的值是:InternalResourceView
,这叫做网络资源视图
。
view在执行过程中,各种类型的view,只有在下面的步骤获得view的时候,才会产生不同的类型:
在上面的这一步中,获得视图对象的时候,会根据我们的需求,获得不同的view对象。
现在我没有什么需求,普通情况下,获得的是InternalResourceView
。
如果我的项目当中加上jstl的标签,那么这里获得的是JstlView
。
我们可以看到JstlView extends InternalResourceView
。
今天我们会说到3种view。
第一种叫做InternalResouceView,这就叫做转发视图
。
第二种叫做JstlView,这个也是转发视图
,支持页面当中的jstl。
第三种叫做RedirectView,这个就是重定向视图
。
return “string”,string前面什么都不加,这就是转发,加上redirect,就是重定向。
修改控制层代码,然后重新开始debug。
重复执行上面的步骤,我们看到在view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
之后,view的值是RedirectView
。
我们控制层的方法是:
开启debug,重复上面的过程,找到resolveViewName
位置。
断点走到这里的时候,我们step into和step return两次,第三次step into才会真正进入到resolveViewName方法中。
我们从上图可以看到viewResolvers是视图解析器,是一个数组,说明我们可以在web.xml当中配置多个视图解析器。
但是一般情况下,我们也是只配置一个视图解析器的。
我们可以看到this.viewResolvers的元素是InternalResourceViewResolver
。
进入之后我们看到下面的图:
进入到createView()
方法中,去看一下子类是否能够创建view对象。
然后我们进入super.createView()
方法。
可以看到,在父类当中,是调用了loadView
方法。
然后我们继续step into这个loadView
方法。
我们继续进入到buildView方法中,看看到底是什么内容:
我们继续step into进入super.buildView方法
内部。
控制层方法调整代码为:
重复上面的调试过程,然后可以看到走到下面的判断条件:
我们看到上面图中的代码:String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
这句话是将视图名称当中的redirect:
这一段给截取掉了,只剩下了/index.jsp
赋值给了redirectUrl
。
然后不断step over,找到了创建view的位置:
step into这个renderMergedOutputModel
方法。
我们step into进入到sendRedirect
方法内部:
这个东西不用,忽略。