springMvc中的响应处理
使用默认内置视图解析器(ViewResolver)
使用视图控制器
使用Model,Map,ModelMap以及原生servlet传输数据到页面
当使用此方式进行设置之后,会发现所有的参数值都设置到了request作用域
中,那么这三个对象是什么关系呢?
使用ModelAndView对象传输数据到页面
注意:发现当使用modelAndView对象的时候,返回值的类型也是此对象,
可以将要跳转的页面设置成view的名称,来完成跳转的功能,同时数据也是放到request作用域中。
使用session传输数据到页面
怎么往session设置属性?
1.通过servlet api的方式去读写session
- 通过参数绑定的方式去获取servlet api
2.通过自动注入的方式去获取servlet api(推荐使用这种方式)
通过springmvc提供的注解方式去读写session - @SessionAttributes
用在类上面的,写入session的。
@SessionAttribute
用在参数上面的,负责读取session
默认指定的属性是必须要存在的,如果不存在则会报错,可以设
置required =false 不需要必须存在,不存在默认绑定null
使用@ModelAttribute来获取请求中的数据
update方法的使用
总结:通过刚刚的给参数赋值,大家应该能够发现,当给方法中的参数设置值的时候,如果添加了@ModelAttribute注解,那么在查找值的时候,是遵循以下方式:
1、方法的参数使用参数的类型首字母小写,或者使用@ModelAttribute(“”)的值。
2、先看之前是否在model中设置过该属性值,如果设置过就直接获取
3、看@SessionAttributes注解标注类中的方法是否给session中赋值,如果有的话,也是直接获取,没有报异常
注意:
3种方式的获取servletapi的线程安全问题:
- 通过参数绑定的方式
是线程安全的,因为参数绑定变量时方法级别,所以每次请求方法都会创建一个新的私有变量。
2.通过自动注入的方式@AutoWired是线程安全的,spring底层通过自动注入 将 servlet api 封装到ThreadLocal(是绑定在线程上面的)里面.
3.通过@ModelAttribute的方式
不是线程安全的,控制器是单例的,并且变量声明在类的级别中(共享变量)。
使用forward实现页面转发
在发送请求的时候,可以通过forward:来实现转发的功能:
使用redirect来实现重定向
请求转发的特点:
1、地址栏的请求不会发生变化,显示的还是第一次请求的地址
2、请求的次数,有且仅有一次请求
3、请求域中的数据不会丢失
4、根目录:localhost:8080/项目地址/,包含了项目的访问地址
请求重定向的特点:
1、地址栏的地址发生变化,显示最新发送请求的地址
2、请求次数:2次
3、请求域中的数据会丢失,因为是不同的请求
4、根目录:localhost:8080/ 不包含项目的名称
请求转发和请求重定向的对比
springmvc 控制器是不是单例的?如果是单例的会出现什么问题?怎么解决?
是单例模式,所以在多线程访问的时候有线程安全问题。将参数放在方法上就不会出现线程安全问题,或者使用@Autowired注解来解决线程安全问题。