• SpringMVC学习记录4


    主题

    SpringMVC有很多很多的注解.其中有2个注解@SessionAttributes @ModelAttribute我平时一般不用,因为实在是太灵活了.但是又有一定限制,用不好容易错..

    最近花了点时间研究了下,记录一下容易犯错的地方.

    @SessionAttributes

    作用范围

    这个注解被@Target({ElementType.TYPE})修饰,所以只能用在类上,用于多个request共享对象.它会把Model中set过的Arrtibute自动放到sessionAttribute中.

    网上有些文章说用这种方法存放的对象不能跨Controller访问.实际我测试在不同Controller中也是可以访问的.这个注解效果就是出了Controller的handler方法以后自动设置model中的对象到HttpSession里.

    易错点

    光使用这个注解是没啥卵用的,大部分时间可能是与@ModelAttribute一起使用..

    当@ModelAttribute修饰Controller中的handler方法的参数的时候如果@ModelAttribute的value属性在SessionAttributes的value中的话那说明这个@ModelAttribute修饰的参数是需要从session中取值的,如果这个时候session里没有这个对象,是null的话就会报错.

     1 org.springframework.web.HttpSessionRequiredException: Expected session attribute 'XXXX'
     2     org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:115)
     3     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:753)
     4     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
     5     org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
     6     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
     7     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
     8     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
     9     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
    10     javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    11     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    12     javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
    13     org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    14     org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    15     org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    16     org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    17     org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
    18     org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    19     org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    20     org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    21     org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
    22     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
    23     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    View Code

    这个就比较蛋疼了...所以我一般要使用session的时候直接在handler方法中注入HttpSession即可.

    @ModelAttribute

    作用范围

    这个注解大概可以用在2个地方,第一个是修饰Controller中的方法,第二个是修饰handler方法中的参数

    修饰Controller中的方法

    这样用的话这个controller的方法会在所有@requestMapping的方法之前被调用,方法的返回值会被丢到Model中,相当于是帮助本Controller的所有handler做一个前置处理.这个方法参数也可以传Model,所以也可以自己往Model中set属性,并设置方法返回值为void.

    修饰handler方法的参数

    这样的用法的话就比较蛋疼了..到底这个方法参数取什么值有很多情况...

    我试了一下,取值顺序应该是:

    1.如果Controller中设置了@ModelAttribute修饰的方法,那handler参数取@ModelAttribute修饰的方法的返回值.

    2.如果1不成立,Controller上标注了@SessionAttributes,那handler参数取session中存的值(不用@sessionAttributes,直接设置session没什么卵用,一定要用注解)

    3.如果2不成立,那handler参数取页面传过来的参数,没有就调用空的构造方法new一个对象

    4.除了取值之外用@ModelAttribute与@valid修饰的参数会自动做校验,这个参数后面跟着BindingResult的话可以记录校验结果.

     总结

    @SessionAttributes @ModelAttribute 这2个注解真的太灵活了....一般我不太实用,因为很容易错...需要用到session的话我会自己在handler方法上注入HttpSession...如果要绑定参数的话我一般用jackson和@requestbody注解来做绑定....

     

  • 相关阅读:
    手机浏览器的viewport(视觉窗口)
    google开源了google chrome android
    Yii 直接执行SQL语句(转)
    WebKit学习网址收集
    Yii CDbCriteria的常用方法
    现货黄金入门知识普及一:图形分析之K线理论
    java 获取当前函数名
    yii url生成
    android 判断屏幕是否关闭
    yii yiiplayground
  • 原文地址:https://www.cnblogs.com/abcwt112/p/6042060.html
Copyright © 2020-2023  润新知