• spring 容器加载


    Spring MVC 会把ModeAndView 的 model 中数据放入到request域对象中。

    在jsp页面,请求页面获得的值  

    ${requestScope.names}

    目标方法可以添加map类型的数据。

    @SessionAttributes()

    请求域 requestScope

    会话域 sessionScope

    @SessionAttributes除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是value属性值),还可以通过模型属性的对象类型指定那些模型属性需要放到会话中(实际上使用的是types属性值)。

    注意:该注解只能放在类的上面,而不能修饰方法。

    有@ModelAttribute 标记的方法,会在每个目标方法执行之前被Spring MVC 调用。

    (链接例子:关于回显功能的部分显示值,对于未赋值的新建对象属性,其值不是为空的,而是有正确值的,比如回显用户的一些信息,但是密码是不能回显示出来的。)

    执行流程:

    1. 执行@ModelAttribute 注解修饰的方法: 从数据库中取出对象,把对象放入到了Map中,键为:user

    2.SpringMVC 从Map中取出User对象,并把表单的请求参数赋给该User对象的对应属性。

    3.SpringMVC 把上述对象传入目标方法的参数。

    注意:在@ModelAttribute 修饰的方法中,放入到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致。

    源码分析流程:

    1. 调用@ModelAttribute 注解修饰的方法。实际上把@ModelAttribute 方法中Map中的数据放在了implicitModel 中。

    2. 解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder 对象的target 属性

    1).创建WebDataBinder 对象:

    --> 确定objectName 属性: 若传入的attrName 属性值为“”,则objectName 为类名第一个字母小写。

    注意: attrName .若目标方法的POJO属性使用了@ModelAttribute 来修饰,则attrName值即为@ModelAttribute的value属性值

    --> 确定target属性:

       >  在implicitModel中查找attrName 对应的属性值,若存在,ok

       >   ***若不存在:则验证当前Handler是否使用了@SessionAttribute 进行修饰,若使用了,则尝试从session 中获取attrName所对应的属性值,若session中没有对应的属性值,则抛出了异常。

       >   若Handler 没有使用@SessionAttributes 进行修饰,或@SessionAttributes中没有使用value值指定的key 和attrName 相匹配,则通过反射创建了POJO对象。

    2) . SpringMVC 把表单的请求参数赋给了WebDataBinder 的target 对应的属性值。

    3) .  ** SpringMVC 会把WebDataBinder 的attrName 和 target给到implicitModel 。进而传到request域对象中。

    4 ).  把WebDataBinder 的target 作为参数传递给目标方法的入参。

    2.@ModelAttribute 注解也可以来修饰目标POJO类型入参,其value属性值有如下作用:

    1) .SpringMVC 会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中。

    2) . SpringMVC 会一value为key,POJO类型的对象为value,存入到request中。

    key值默认为类名的首字母小写。也可以用@ModelAttribute 类指定key值。

    视图     视图解析器

    --> 程序员可以选用一种视图解析器或混用多种视图解析器。

    --> 每个视图解析器都实现了Ordered接口并开放出一个order属性,可以通过order属性指定解析器的优先顺序,order越小优先级越高。

    -->  SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。

    InternalResourceView

    把JSTL标签放到当前类路径下,这时解析的view就会变成JstlView。

    配置直接转发的页面 ,可以直接响应转发页面,而无需使用Handler方法。

    在实际开发中通常都需要配置mvc: annotation-driven 

    配置视图 BeanNameViewResolver 解析器:使用视图的名字来解析视图。

    通过order属性来定义视图解析器的优先级,order值越小,优先级越高。

    --> 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。

    --> 如果返回的字符串中带有forward: 或 redirect: 前缀时,SpringMVC会对他们进行特殊处理:将forward: 和redirect:当成指示符,其后的字符串作为URL来处理

    重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

    ​转   发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。​

    -- redirect:success.jsp :会完成一个到success.jsp的重定向的操作。

    -- forward:success.jsp  :会完成一个到success.jsp的转发操作

  • 相关阅读:
    数组有没有length()这个方法? String有没有length()这个方法?
    序列化接口的id有什么用?
    如何进行Hibernate的性能优化?
    构造器Constructor是否可被override?
    Collection框架中实现比较要实现什么接口?
    ArrayList如何实现插入的数据按自定义的方式有序存放?
    Java中会存在内存泄漏吗,请简单描述?
    List 和 Map 区别?
    面向对象的特征有哪些?
    垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
  • 原文地址:https://www.cnblogs.com/kelan/p/5284607.html
Copyright © 2020-2023  润新知