spring3.X mvc 应用Session属性的策略
喜好读书,就便是把生活生计中寂寞的辰光换成重大享受的时刻。本文项目组内容参考至:http://anffvf.blog.163.com/blog/static/314754201101342148699/
士兵不要思惟,有魁首替他们思惟。?
WEB 应用凡是会引入 Session,用来在办事端和客户端之间保存一系列动作/消息的状况,比如网上购物保护 user 登录信息直到 user 退出。在 user 登录后,Session 周期里有很多 action 都须要从 Session 中获得 user,再验证身份权限,或者进行其他的操纵。这此中就会涉及到法度去接见 Session属性的题目。在java中,Servlet 规范供给了 HttpSession对象来满足这种需求。开辟人员可以从 HttpServletRquest对象获得 HttpSession,再从HttpSession中获得状况信息。
还是回到购物车的例子,假设在 controller 某个办法(本文简称为action)中我们要从HttpSession中取到user对象。若是基于Servlet,标准的代码会是如许的:
@Controller@SessionAttributes("currentUser")public class GreetingController{@RequestMappingpublic void hello(@ModelAttribute("currentUser") User user){//user.sayHello()}//}?
应用这种规划,还须要在 SpringMVC 设备文件的 ViewResolver 定义处,加上 p:allowSessionOverride="true",如许若是你对 User 对象做了批改,SpringMVC 就会在衬着 View 的同时覆写 Session 中的相干属性。
1. 具备第二种规划的所有长处
2. 应用 Annotation 声明对 Session 特定属性的存取,每个 action 只须要声明本身想要的 Session 属性。
3. 其他人能很轻易地从 action 的参数列表得知 action 所须要的依附,API 更清楚易懂。
1. 对于雷同属性的 Session 对象,须要在每个 action 上定义。
2. 这种规划并不是 SpringMVC 的初志,是以有可能会引起一些争议。
纵观这四类办法,我们可以看出我们对 Session 属性的接见把握设置,是从所有 Servlet,到某一类型的 controller 的成员变量,到所有 action 的某一类型参数,再到具体 action 的具体对象。每种规划都有各自的长处和不足:第一种规划固然正确,但可惜引入了对 Servlet API 的依附,晦气于 controller 的测试和逻辑复用。第二、三种规划固然解决了对 Servlet API 的依附,也分别在 controller 和 action 级别上供给了对 Session 属性的接见,但注入粒度在必然程度上还是不敷细,要想对具体属性进行接见可能会斗劲繁琐。不过,这在另一方面也供给了简便而同一的办法来对一系列雷同类型的参数进行注入。第四种规划经由过程应用 Annotation,不仅摆脱了 Servlet API 的依附,并且在 action 级别上供给了对 Session 具体属性的接见把握。然则这种接见有可能会粒度详尽,须要在很多不合 action 上声明雷同的 annotation。并且,毕竟成果这种用法并不是 SpringMVC 的初志和推荐的,可能会带来一些争议。
本文演示了 Spring2.5 接见 Session 属性的几种不合解决规划,并解析了各自的长处和不足。本文并不筹算对这些解决规划评出对错,只是试图列出在选择规划时的思维过程以及选择标准。每种规划都能满足某一类高低文的需求,在特定的开辟景象和团队中都可能会是最优的选择。然则笔者还是发明,全部过程中,一些通俗轻易忽视的 OOP 的准则或者原则在阐扬着效应,鉴于本文篇幅已经较长,就留到后续文章中持续商量解决规划选择背后的深层含义,敬请等待。
?