快速业务通道

Spring 2.5访问Session属性的四种策略 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
有没有提供相应的 handler 呢?如果我们能够对 action 实现注入,出现的种种不足了。

通过查阅 SpringMVC API 文档,SpringMVC 其实也为 action 级别提供了方法参数注入的 Resolver 扩展,允许开发人员给 HandlerMapper 类 set 自定义的 MethodArgumentResolver。

action 的代码如下:

@RequestMapping public void hello(User user){ //user.sayHello() }

Resolver 的代码如下:

public class UserArgumentResolver implements WebArgumentResolver {   public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {     if (methodParameter.getParameterType().equals(User.class)) {       return webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_SESSION);     }     return UNRESOLVED;   } }

Spring 2.5访问Session属性的四种策略(4)

时间:2011-09-07

配置文件的相关配置如下:

<bean class="org.springframework.web.servlet.mvc.annotation.OwnAnnotationMethodHandlerAdapter">   <property name="customArgumentResolver">     <ref bean="userArgumentResolver"/><!-- userArgumentResolver bean 的定义省略 -->   </property> </bean>

优点:

1. 具备第二种方案的所有优点

2. 真正做到了按需分配,只在真正需要对象的位置注入具体的对象,减少其他地方对该对象的依赖。

3. 其他人能很容易地从 action 的参数列表得知 action 所需要的依赖,API 更清晰易懂。

4. 对于很多 action 需要的某一类参数,可以在唯一的设置点用很方便一致的方式进行注入。

不足:

1. 对象依赖注入是针对所有 action, 注入粒度还是较粗。不能做到具体 action 访问具体的 Session 属性

(四)通过 SpringMVC 的 SessionAttributes Annotation 关联 User 属性

SpringMVC 文档提到了 @SessionAttributes annotation,和 @ModelAttribute 配合使用可以往 Session 中存或者从 Session 中取指定属性名的具体对象。文档里说;

The type-level @SessionAttributes annotation declares session attributes used by a specific handler. This will typically list the names of model attributes which should be transparently stored in the session or some conversational storage, serving as form-backing beans between subsequent requests.

很明显,@SessionAttributes 是用来在 controller 内部共享 model 属性的。从文档自带的例子来看,标注成 @SessionAttributes 属性的对象,会一直保留在 Session 或者其他会话存储中,直到 SessionStatus 被显式 setComplete()。那这个 annotation 对我们有什么帮助呢?

答案就是我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在 setup action 的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。只要我们不去调用 SessionStatus 的 setComplete() 方法,这个对象就会一直保留在 Session 中,从而实现 Session 信息的共享。

controller的代码如下:

@Controller @SessionAttributes("currentUser") public class GreetingController{ @RequestMapping public void hello(@ModelAttribute("currentUser") User user){ //user.sayHello() } //... }

Spring 2.5访问S

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号