SpringMVC视图解析原理
上文讲解了SpringMVC对于请求方法的返回值是如何做出响应处理的,大概来讲就是使用ReturnValueHandler
返回值处理器产生相应的返回值(json数据,字符串...),这个过程会用到消息转换器将返回值对象实例转换为相应类型的数据。在进行了响应处理之后,SpringMVC就会进行视图解析。那么,SpringMVC是如何进行视图解析的呢?
对于视图处理方式,有这么几种:转发
,重定向
,自定义视图
基本流程
-
在目标方法处理的过程中,所有数据都会被存放在
ModelAndViewContainer
中,包括数据和视图地址。如果方法的参数是自定义类型对象(值是从请求参数中确定的),也会被放在ModelAndViewContainer
中 -
任何目标方法执行完成后,SpringMVC都会返回一个
ModelAndViewContainer
,包含数据和视图地址 -
最终执行
processDispatchResult()
方法,处理派发结果,决定页面该如何响应
底层的关键是执行render(mv, request, response);
进行页面渲染
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
根据视图名得到View
对象(定义了页面的渲染逻辑)
解析出View对象的过程是使用了ViewResolver
视图解析器。可以看到,循环遍历所有的视图解析器,直到根据视图名解析出View
对象
最后调用View
对象自定义的render()
方法进行页面渲染工作
视图解析器
SpringMVC定义好了多个ViewResolver
视图解析器
其中的ThymeleafViewResolver
是Thymeleaf模板引擎提供的
如果我们使用Thymeleaf模板引擎,那么请求方法
- 返回值以
forward
开始,模板引擎会new InternalResourceView(forwardUrl)
,这个View对象的render方法会调用request.getRequestDispatcher(path).forward(request, response);
进行转发 - 返回值以
redirect
开始,模板引擎会new RedirectView()
,这个View对象的render方法就是进行重定向 - 返回值是普通字符串,模板引擎会
new ThymeleafView()
,调用相应的render方法