课题_Spring MVC中Session的正确用法之我见

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性、可复用性与易集成性。优良的设计模式遍及各处,使得其框架虽然学习曲线陡峭,但一旦掌握则欲罢不能。初学者并不需要过多了解框架的实现原理,随便搜一下如何使用“基于注解的controller”就能很快上手,而一些书籍诸如“spring in action”也给上手提供了非常优良的选择。

网上的帖子多如牛毛,中文的快速上手,英文的深入浅出。这样看来,Spring的学习简直是一个轻松愉快的过程。

但是!!

关于Spring中session的使用,大部分资料都讳莫如深。也许这个问题太过容易推断出?大部分资料都没有包括我下面所将要陈述的内容。关于Spring中session的正确使用方法,这里甚至建议直接使用Session。但这种方法显然违背了Spring “technology agnostic” (这个名词我理解意思就是无论你是在什么具体的应用中使用类似的控制逻辑,servlet、一个本地JVM 程序或者其他,你的Controller都可以得到复用)的初衷。

于是我开始从庞大的网络资源和书籍中搜索关于Session的正确用法及Spring MVC处理Session的机制,其中讲得最深入而且清楚的算是这一篇。从上文的内容,及我所查阅的比如官方文档这种资料中,我可以大约推断出几个要点:

1. Spring框架会在调用完Controller之后、渲染View之前检查Model的信息,并把@SessionAttributes()注释标明的属性加入session中

2. @ModelAttribute在声明Controller的参数的时候,可以用来表明此参数引用某个存在在Model中的对象,如果这个对象已经存在于Model中的话(Model可以在调用Controller之前就已经保存有数据,这应该不仅仅因为HandlerInterceptor或者

@ModelAttribute标记的方法已经显式的将一些对象加入到了Model对象中,也因为Spring会默认将一些对象加入到Model中,这一点很重要)。

3. 如果Session中已经存在某个对象,那么可以直接使用ModelAttribute声明Controller的参数,在Controller中可以直接使用它。

其中1很明确,我提到的那篇文章主要就在说明这一点。而从2和3我们也许可以大胆地推出一个结论:

Spring会在调用Controller之前将session中的对象填入Model中

因为想从2得到3,这个结论就显得比较自然。那么事实上是不是如此呢?可以做一个小实验。仿效我所引用的那篇文章,我写了如下代码:

@Controller

@RequestMapping("/user")

@SessionAttributes("userId")

public class UserController {

@RequestMapping(value="/login", method=GET)

public String login (

int id, Model model, ServletRequest request, Session session) {

model.addAttribute("userId", id);

System.out.println("");

System.out.println("");

System.out.println("inside login");

System.out.println("");

System.out.println("--- Model data ---");

Map modelMap = model.asMap();

for (Object modelKey : modelMap.keySet()) {

Object modelValue = modelMap.get(modelKey);

System.out.println(modelKey + " -- " + modelValue);

}

System.out.println("");

System.out.println("*** Session data ***");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

String s = e.nextElement();

System.out.println(s + " == " + session.getAttribute(s)); }

return "/test";

}

@RequestMapping(value="/check", method=GET)

public String check (

Model model, ServletRequest request, Session session) {

System.out.println("");

System.out.println("");

System.out.println("inside check");

System.out.println("");

System.out.println("--- Model data ---");

Map modelMap = model.asMap();

for (Object modelKey : modelMap.keySet()) {

Object modelValue = modelMap.get(modelKey);

System.out.println(modelKey + " -- " + modelValue);

}

System.out.println("");

System.out.println("*** Session data ***");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

String s = e.nextElement();

System.out.println(s + " == " + session.getAttribute(s));

相关文档
最新文档