咱们都知道,struts 能够在action中绑定数据,进而在页面中经过s 标签,ognl表达式输出。session
关于 value stack以及 action contextapp
用 <s:debug/> 能够查看 value stack 以及 action context, 很是清楚。value stack 的栈顶就是 所访问的action。spa
对于s标签里面的内容,例如<s:property value="username"/>,struts 在解析这个标签的时候,会首先在action中查找有没有这个属性,找不到才去 action context中找。而若是这样写,<s:property value="#username"/>,struts会直接去 action context 中找。经过 ServletActionContext.getContext() 可获取到 action context, 是一个map。.net
而 action 自己也在 action context 中,action context存储了大部分经常使用的对象,例如 request,response,session,application 等等,具体能够在 s:debug 中看到。debug
对于ognl表达式,用#就代表从 action context中查找,不用#就是直接去value stack栈顶,即action中查找。对象
由于session就在action context中,所以 访问session就须要加 #, <s:property value="#session.username"/> .blog
疑问:可是对于 <s:property value="#request.username"/> 若是request中没有username属性,则依次去 action,action context,session中去找。 这多是由于 action, action context, session 都在request中有引用的缘故吧。get
关于更详细的原理,参阅:io
Struts2数据传输的背后机制:ValueStack(值栈) 原理
在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等