标题:Struts2的Action访问Session对象的两种方式及原理


Struts2的Action中若希望访问Session对象,可采用两种方式:

1、从ActionContext中获取;

2、实现SessionAware接口。

1、从ActionContext中获取:

importjava.util.Map;

importcom.opensymphony.xwork2.ActionContext;

importcom.opensymphony.xwork2.ActionSupport;

publicclassSessionTestActionextendsActionSupport{

publicStringexecute(){

ActionContextactionContext=ActionContext.getContext()//先获得ActionContext实例

Mapsession=actionContext.getSession();

session.put("USER_NAME","TestUser");

returnSUCCESS;

}

}

importjava.util.Map;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;publicclassSessionTestActionextendsActionSupport{publicStringexecute(){ActionContextactionContext=ActionContext.getContext();Mapsession=actionContext.getSession();session.put("USER_NAME","TestUser");returnSUCCESS;}}

2、实现SessionAware接口:

[java]viewplaincopyprint?

importjava.util.Map;

importorg.apache.struts2.interceptor.SessionAware;

importcom.opensymphony.xwork2.ActionSupport;

publicclassSessionTest1ActionextendsActionSupportimplementsSessionAware{

privateMapsession;

publicvoidsetSession(Mapsession){

this.session=session;

}

publicStringexecute(){

this.session.put("USER_NAME","TestUser1");

returnSUCCESS;

}

}

importjava.util.Map;importorg.apache.struts2.interceptor.SessionAware;
importcom.opensymphony.xwork2.ActionSupport;
publicclassSessionTest1ActionextendsActionSupportimplementsSessionAware{
privateMapsession;
publicvoidsetSession(Mapsession){
this.session=session;
}
publicStringexecute(){
this.session.put("USER_NAME","TestUser1");
returnSUCCESS;
}
}

进一步阅读Struts2.1.8.1源码,SessionAware接口的实现方式如下:

struts-default.xml配置:

<interceptors>

<interceptorname="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

</interceptors>

<interceptor-stackname="defaultStack">

<interceptor-refname="servletConfig"/>

</interceptor-stack>

<interceptors>…<interceptorname="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
…</interceptors><interceptor-stackname="defaultStack">…<interceptor-refname="servletConfig"/>…</interceptor-stack>

打开ServletConfigInterceptor.java源码:

publicStringintercept(ActionInvocationinvocation)throwsException{

finalObjectaction=invocation.getAction();

finalActionContextcontext=invocation.getInvocationContext();

if(actioninstanceofSessionAware){

((SessionAware)action)。setSession(context.getSession());

}

returninvocation.invoke();

}

publicStringintercept(ActionInvocationinvocation)throwsException{finalObjectaction=invocation.getAction();
finalActionContextcontext=invocation.getInvocationContext();…if(actioninstanceofSessionAware){
((SessionAware)action)。setSession(context.getSession());}…returninvocation.invoke();}

即在拦截器处理过程中发现目标Action实现了SessionAware接口,便会调用Action中已经实现的setSession(…)方法,
将ActionContext中包装的Session注入目标Action中。目标Action也就可以进一步对Session进行操作了。

文章来源:http://java.chinaitlab.com/Struts/896689.html

转载于:https://blog.51cto.com/wht6650/1316614

Struts2的Action访问Session对象的两种方式及原理相关推荐

  1. CAD框选对象的两种方式、AUTOCAD——删除重复线段

    今天就用CAD梦想画图软件来说明一下用鼠标框选对象的两种方式的区别. 操作工具 操作系统:Windows10 CAD软件:CAD梦想画图 步骤 1.第一种方式是鼠标往左移动框选对象,会出现一个绿色的虚 ...

  2. putextra 传递对象_intent.putextra用法 使用Intent传递对象的两种方式 - 电脑常识 - 服务器之家...

    intent.putextra用法 使用Intent传递对象的两种方式 发布时间:2017-05-22 来源:服务器之家 Intent 的用法相信你已经比较熟悉了,我们可以借助它来启动活动.发送广播. ...

  3. (9) hibernate加载持久化对象的两种方式——get、load

    一.get与load对比 在hibernate中get和load方法是根据id取得持久化对象的两种方法,但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

  4. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

  5. Struts2中Action访问Servlet API的三种方法

    Struts2的Action并未直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不再与Servlet API耦合,能更轻松的测试该Action.但如何访问? ...

  6. struts2学习之表单校验的两种方式

    基于覆盖validate方法的表单校验 Action类一般都继承ActionSupport类. 通过覆盖ActionSupport类的validate方法即可在自己的Action类中校验输入项的值. ...

  7. hibernate加载持久化对象的两种方式---------------load方式和get方式

    2019独角兽企业重金招聘Python工程师标准>>> 参考:http://my.oschina.net/u/1169535/blog/282483 1. Hibernate get ...

  8. QT之在QML中使用C++类和对象的两种方式

    一 类的方式实现在QML中使用C++对象 二 对象的方式实现在QML中使用C++对象 QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Q ...

  9. 【url传参】之 获取url?后面的参数,对应参数名获取值 和 全量获取转换为对象结构两种方式

    访问你挚爱的强哥_百度搜索https://www.baidu.com/s?wd=%E4%BD%A0%E6%8C%9A%E7%88%B1%E7%9A%84%E5%BC%BA%E5%93%A5&r ...

  10. 访问HTTP网址的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 一.使用HttpClient: NameValuePair username = new BasicNameValuePair ...

最新文章

  1. netapp学习(十三)---Snapshot基础知识(上)
  2. Java基础案例教程
  3. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单
  4. 100份Spring面试问答-最终名单(PDF下载)
  5. Solr单机安装Version5.5.2
  6. java redis db0 db1_SpringBoot-技术专区-Redis同数据源动态切换db
  7. 云计算项目实战——系统API模块
  8. C# 之 Win32 Api使用
  9. 开源办公系统:支持在线Office在线编辑、文档协同
  10. C# 如何插入、编辑和删除Excel批注
  11. 瞬时视场、识别距离、mrtd
  12. 使用svg实现的曲线时间线 2022-01-09
  13. c语言三位数中有多少素数,输出所以三位数的素数,并求素数的个数,每行输出10个数...
  14. php开发游戏玩家属性,游戏数值策划属性篇(一)
  15. mysql设置外部ip访问
  16. 解决在uniapp项目中小程序调用获取微信绑定手机号
  17. 《5G网络协议与客户感知》读书笔记 | 会话管理信令序列
  18. Linux驱动之platform设备驱动
  19. 云顶之弈怎么防止被机器人拉_云顶之奕机器人勾人规律和原理-云顶之奕机器人勾人技巧讲解...
  20. UGUI优化:使用镜像图片

热门文章

  1. Qt——菜单栏、工具栏、状态栏
  2. tensorflow中命名空间、变量命名的问题
  3. How to add libraries to “External Libraries” in WebStorm/PhpStorm/Intellij
  4. vue项目下,webpack.js/package.json配置
  5. 迭代器模式(Iterator)和组合模式(Composite)
  6. STORM的三种事务
  7. 剖析Disruptor:为什么会这么快?(三)揭秘内存屏障
  8. ActiveMQ笔记(二)
  9. 《Asp.Net 2.0 揭秘记(十四)
  10. Repost: An introduction to Linux IPC by Michael Kerrisk -- IPC 分类