SpringMVC学习记录4

时间:2022-09-24 08:16:18

主题

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的话就会报错.

 org.springframework.web.HttpSessionRequiredException: Expected session attribute 'XXXX'
org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:115)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:753)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

这个就比较蛋疼了...所以我一般要使用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注解来做绑定....

SpringMVC学习记录4的更多相关文章

  1. springMVC学习记录1-使用XML进行配置

    SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,Spring WEB中除了有springMVC还有struts2,webWork等MVC ...

  2. SpringMVC学习记录5

    Springmvc流程中的扩展点有很多,可以在很多地方插入自己的代码逻辑达到控制流程的目的. 如果要对Controller的handler方法做统一的处理.我想应该会有很多选择,比如:@ModelAt ...

  3. SpringMVC学习记录3

    这次的主题 最近一直在学习SpringMVC..(这句话我已经至少写了3,4遍了....).这次的研究主要是RequestMappingHandlerAdapter中的各种ArgumentsResol ...

  4. SpringMVC学习记录2

    废话 最近在看SpringMVC...里面东西好多...反正东看一点西看一点吧... 分享一下最近的一些心得..是关于DispatcherServlet的 DispatcherServlet与Cont ...

  5. SpringMVC学习记录

    1E)Spring MVC框架 ①Jar包结构: docs+libs+schema. 版本区别:核心包,源码包. SpringMVC文档学习: 学习三步骤: 1)是什么? 开源框架 2)做什么? IO ...

  6. springMVC学习记录2-使用注解配置

    前面说了一下使用xml配置springmvc,下面再说说注解配置.项目如下: 业务很简单,主页和输入用户名和密码进行登陆的页面. 看一下springmvc的配置文件: <?xml version ...

  7. SpringMVC学习记录1

    起因 以前大三暑假实习的时候看到公司用SpringMVC而不是Struts2,老司机告诉我SpringMVC各种方便,各种解耦. 然后我自己试了试..好像是蛮方便的.... 基本上在Spring的基础 ...

  8. springMVC学习记录3-拦截器和文件上传

    拦截器和文件上传算是springmvc中比较高级一点的内容了吧,让我们一起看一下. 下面先说说拦截器.拦截器和过滤器有点像,都可以在请求被处理之前和请求被处理之到做一些额外的操作. 1. 实现Hand ...

  9. SpringMVC学习记录七——sjon数据交互和拦截器

    21       json数据交互 21.1      为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservi ...

随机推荐

  1. 诡异的localhost无法连接

    上午试了localhost发现提示无法连接,ping了下localhost,能够ping通. 重启了Apache,还是无法解决. 试着停止了Apache服务,然后再连接localhost,发现浏览器提 ...

  2. Python——Day3知识点——文件操作

    一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ...

  3. &lbrack;原创&rsqb;cocos2d-x研习录-第二阶 基本概念

    在Cocos2D-x引擎中,有几个非常重要的概念:导演(CCDirector).摄像机(CCCamera).场景(CCSecen).布景(CCLayer).精灵(CCSPrite)和动作(CCActi ...

  4. &lbrack;转载&rsqb;为什么我希望用C而不是C&plus;&plus;来实现ZeroMQ

    来源: http://blog.jobbole.com/19647/ 开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的.在我的整个职业生涯里我都在使 ...

  5. &lbrack;转&rsqb;Vim 复制粘贴探秘

    Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情.每当学会了vim的一个新功能,就会很大地提高工作效率.有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim ...

  6. HDU&lowbar;2023——求平均成绩

    Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. ...

  7. 从安装&period;net Core 到helloWord&lpar;Mac上&rpar;

    最近听说微软 正式发不了.netCore 1.0 于是就安装了 并安装了vs Code 用于编写一些.net程序 一. .netCore的安装: 首先需要通过brew安装openssl(相信homeB ...

  8. &lbrack;POJ 2226&rsqb; Muddy Fields

    题目 Description 如何放木板保证只覆盖到 '*' 而没有覆盖到 '.' Solution (我太废了竟然想这题想了一个小时)考虑当前需要被覆盖的点 (x,y),假设有一块横着铺的木板 i ...

  9. RabbitMQ&lpar;3&rpar; Spring boot集成RabbitMQ

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持. 资源代码:练习用的代码. ...

  10. Visual Studio 2012 &amp&semi; MyEclipse2015 快捷键对比