2019年6月18日 - day06 - 上午 - 开始
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:设置请求头的约束性,字符串类型的数组。
- value="请求路径"
- RESTful
- HiddenHttpMethodFilter:过滤器,
_method
参数。 - GET查询,POST添加,PUT修改,DELETE删除。
- HiddenHttpMethodFilter:过滤器,
- 处理请求数据@RequestParam
- value:自定义映射关系
- required:是否必须。
- defaultValue:默认值。
- @RequestHeader
- value
- required
- defaultValue
- @CookieValie
- value
- required
- defaultValue
19 - View视图类型
- jsp展示普通信息
- 有jstl的页面,就是循环作用域当中的集合,循环展示。
- view这个接口下面,只有一个实现类,就是AbstractView。
调试view源码
在这一步,我们step over执行下一步,然后看一下view的值。
可以看到view的值是JstlView
。
我们的项目中有这几个jar包,我们先把这几个jar包删除一下,然后重新debug。
当我们删除了这几个jar包之后,重新执行上面的步骤,看到下面的view的值:
我们看到view的值是:InternalResourceView
,这叫做网络资源视图
。
view在执行过程中,各种类型的view,只有在下面的步骤获得view的时候,才会产生不同的类型:
在上面的这一步中,获得视图对象的时候,会根据我们的需求,获得不同的view对象。
现在我没有什么需求,普通情况下,获得的是InternalResourceView
。
如果我的项目当中加上jstl的标签,那么这里获得的是JstlView
。
我们可以看到JstlView extends InternalResourceView
。
三种view
今天我们会说到3种view。
第一种叫做InternalResouceView,这就叫做转发视图
。
第二种叫做JstlView,这个也是转发视图
,支持页面当中的jstl。
第三种叫做RedirectView,这个就是重定向视图
。
RedirectView
return “string”,string前面什么都不加,这就是转发,加上redirect,就是重定向。
修改控制层代码,然后重新开始debug。
重复执行上面的步骤,我们看到在view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
之后,view的值是RedirectView
。
20 - 各种View源码调试
写笔记
调试InternalResourceView
我们控制层的方法是:
开启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方法
内部。
调试RedirectView
控制层方法调整代码为:
重复上面的调试过程,然后可以看到走到下面的判断条件:
我们看到上面图中的代码:String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
这句话是将视图名称当中的redirect:
这一段给截取掉了,只剩下了/index.jsp
赋值给了redirectUrl
。
然后不断step over,找到了创建view的位置:
step into这个renderMergedOutputModel
方法。
我们step into进入到sendRedirect
方法内部:
mvc:view-controller标签
这个东西不用,忽略。