Struct2中Session的获取及数据共享原理

来源:互联网 发布:mysql 树查询 编辑:程序博客网 时间:2024/04/28 11:13

Struct2中的Session一般有三种获取方式,网上一搜就大把的是,这里说一种比较常用的是实现SessionAware接口,这种方式更符合面向接口的编程思想,使用这种方式需要创建一个MAP类型的成员变量Session,并实现SetSession方法




Session一般不用于前台往后台传数据,往Session中放置数据一般在后台来做,一旦在Session中放置了某些数据,则在Session超过最大有效期前,Session中的这些数据是一直存在的,并且在浏览器关闭前,不管在哪个方法中都能取到Session中的值.

扩展:当然在浏览器关闭后可以通过将Cookie保存在本地,实现再次打开浏览器时获取之前已经生成的Session(Cookie中保存的有Session的ID,再次请求服务器时,服务器会根据SessionId寻找Session),详情请参照另一片博客:Cookie的保存形式及Session的实现机制.

即使是在多例模式先的Action中,Session也是共享的.有人会疑惑:在struct2默认的多例Action中,每一次请求就

会创建一个新的action,新创建的action中并不可能存在先前的Session啊?

其实,是存在的,比如通过实现SessionAware来得到Session,是因为实现了SetSession这个方法,SessionAware

的实现方式如下:




图中的ActionContext.getSession()这个方法会先搜索session,如果有session则返回,如果没有才创建.

图中SessionAware是作为拦截器存在,在这里需要了解一下struct的执行流程,看一下将SessionAware配置

在拦截器中有什么作用:

1)  客户端(Client)向Action发用一个请求(Request)

2)  Container通过web.xml映射请求,并获得控制器(Controller)的名字

3)  容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在

Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter

4)  控制器(Controller)通过ActionMapper获得Action的信息

5)  控制器(Controller)调用ActionProxy

6)  ActionProxy读取Struts.xml文件获取Action和Interceptor stack的信息。

7)  ActionProxy把request请求传递给ActionInvocation

8)  ActionInvocation依次调用action和interceptor

9)  根据action的配置信息,产生result

10) Result信息返回给ActionInvocation

11) 产生一个HttpServletResponse响应

12) 产生的响应行为发送给客服端。

由此可见,Struct2的执行机制总是先new Action,然后才走拦截器,在Action被创建后,拦截器会判断Action是否实现了SessionAware接口,如果实现了,则会调用Action中已经实现的SetSession方法,同时将 ActionContext.getSession()做为参数传递进去,从而得到Session.

以上纯属个人总结,写下备忘,如果错误请大神即使指出,免得误人子弟...

0 0
原创粉丝点击