关于 struts2 的 value stack

    我们都知道,struts 可以在action中绑定数据,进而在页面中通过s 标签,ognl表达式输出。

    关于 value stack以及 action context

        用 <s:debug/> 可以查看 value stack 以及 action context, 非常清楚。value stack 的栈顶就是 所访问的action

        对于s标签里面的内容,例如<s:property value="username"/>,struts 在解析这个标签的时候,会首先在action中查找有没有这个属性,找不到才去 action context中找。而如果这样写,<s:property value="#username"/>,struts会直接去 action context 中找。通过 ServletActionContext.getContext() 可获取到 action context, 是一个map。

        而 action 本身也在 action context 中,action context存储了大部分常用的对象,例如 request,response,session,application 等等,具体可以在 s:debug 中看到。

        对于ognl表达式,用#就表明从 action context中查找,不用#就是直接去value stack栈顶,即action中查找

因为session就在action context中,因此 访问session就需要加 #, <s:property value="#session.username"/> .

        疑问:但是对于 <s:property value="#request.username"/> 如果request中没有username属性,则依次去 action,action context,session中去找。 这可能是因为 action,  action context, session 都在request中有引用的缘故吧。

 

关于更详细的原理,参阅:

        Struts2数据传输的背后机制:ValueStack(值栈)

        在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(struts,stack,Ognl,value)