日期:2014-05-17  浏览次数:20663 次

struts2 概念小问题~望前辈解决.....
刚学struts2....有个问题弄得不是很明白的~~希望,,了解的各位可以和我讲讲~~

就是我们在action 文件的new出来的值室或者接受到的参数等等.....

什么时候 是放在一个栈的Stack Context部分 什么时候是在Value Stack Contents部分呀~~

这个我一直迷迷糊糊的,,每次用标签的时候用了"#.."不行才换回来".." 所以想明确一下这个问题.

------解决方案--------------------
在Struts2中,采用标准命名的上下文(Context)来处理OGNL表达式。处理OGNL的顶级对象是一个Map(也叫context map),而OGNL在这个context中就是一个顶级对象(root)。在用法上,顶级对象的属性访问,是不需要任何标记前缀的。而其它非顶级的对象访问,需要使用#标记。
Struts2框架把OGNL Context设置为我们的ActionContext。并且ValueStack作为OGNL的根对象。除value stack之外,Struts2框架还把代表application、session、request这些对象的Map对象也放到ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能 ,以方便对Action类进行测试!)
Action的实例,总是放到value stack中。因为Action放在stack中,而stack是root(根对象),所以对Action中的属性的访问就可以省略#标记。但是,要访问ActionContext中其它对象的属性,就必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其它对象中去寻找。

------解决方案--------------------
因为Action实例被放在Value stack中,而Value stack又是根元素中的一个,所以对Action中的属性的访问可以不用“#”,其它如request,application,session都需要加“#”