1.视图解析器
1.视图解析器和视图
ModelAndview: 模型数据 (存储业务数据) 和视图
Model: 模型数据(存储模型层中查询到的数据)
View:视图(页面属于视图中的一种)
控制单元执行完成后,无论什么类型返回值,都会封装为ModelAndview。
Model中存储了业务数据,view通常存储视图名。最终目的:将Model 中的业务数据使用视图进行渲染到客户端
底层源码:
ModelAndview mv;
mv = ha.handle(processedRequest, response, mappedHandler.getHandler()):
执行控制单元,控制单元返回结果封装为ModelAndview。
控制单元返回的结果固定被封装为ModelAndview。
视图解析器: ViewResolver (接口),解析不同的视图,使用不同的实现类视图解析器,解析控制单元返回的ModelAndview,经过解析返回具体的view对象。
以.jsp视图为例:
1.控制单元执行后,经过springmvc的封装,返回ModelAndview(viewname为index.jsp)
2.获取到ModelAndView后,执行render(mv,request,response);
3.在render万法中调用了view = resolveViewName(viewName, mv.getModelInternal(), locale, request):
4.在resolveviewName方法中, 视图解析器 根据视图名找到对应的视图对象- 默认的使用的视图解析器: InternalResourceViewResourceView
.jsp使用的视图对象: InternalResourceView
5.返回视图对象后,调用view.render(mv.getModelInternal(),reguest,response);(使用视图对象完成客户端响应结果的渲染)实际完成Mode1中的数据通过视图响应回到客户端
jsp的InternalResourceView的视图对象渲染时:
1.将Mode1中的数据存储大请求域对象中
2.将请求转发到.jsp -> java (获取请求去对象中的数据) -> .class -> 将结果输出到客户端
2.控制单元的方法参数(接受请求参数)
1. 控制单元方法参数写法
控制单元方法参数一共有两种写法:
(1)紧耦方式。获取原生Servlet API,通过原生Servlet API获取请求参数、设置响应内容、设置作用域的值。
(2)解耦方式。使用Spring MVC提供的方式获取请求参数、设置响应内容、设置作用域的值。
2. 解耦方式
解耦方式是Spring MVC独有方式。是Spring MVC给开发者提供的:
(1)获取请求中内容
(2)设置作用域值
(3)设置响应内容
等写法。今天主要看解耦方式下如何获取请求参数和如何设置作用域的值。
3.1 获取请求中内容
请求参数根据参数的类型分为多种写法。
(1)普通表单参数
(2)多个同名参数
(3)日期类型数据
(4)请求头数据
(5)请求体数据
3.1.1 获取普通表单参数
获取普通表单参数,只需要包含在控制单元中提供与请求参数同名的方法参数即可。
Spring MVC会自动进行类型转换
建议使用封装类型,请求数据中没有携带该参数时,自动赋值为null,基本数据类型会报错。
3.1.2 @RequestParam 注解
当请求参数名和控制单元参数名不一致时可使用该注解
3.1.3 使用JavaBean作为参数(使用类对象作为控制单元参数)
3.1.5 接收多个同名表单参数
在提交表单数据时,可能在里面包含复选框。当选中多个复选框时会出现多个同名参数。在Spring MVC中可以使用数组和List接收多个同名参数。
如果是JavaBean中的属性为list集合接受多个同名属性,不需要进行额外处理。
3.1.6 接收日期类型参数
第一种用在参数前面
第二种用在实体类的属性前面
3.2 设置作用域的值
以后可以把查询到的值和集合存在作用域中,然后jsp 就可以利用EL表达式拿到数据并用JSTL操作数据渲染到页面
3.Spring MVC中文乱码问题
1. GET方式中文乱码解决
本机的tomcat自动设置了get请求的乱码问题,插件中的问题需要我们自己解决
2. POST方式中文乱码解决
在web.xml中设置过滤器,过滤器需要放在上面