1、OGNL,北京传智播客教育 ,OGNL表达式语言介绍,OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写, 它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。 OGNL相对其它表达式语言具有下面几大优势:1、支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式:类全名(包括包路径)方法名 | 值名,例如:java.lang.Stringformat(foo %s, bar)或tutorial.MyConstantAPP_NAME; 3、支持赋值操作和表达式串联,如p
2、rice=100, discount=0.8,calculatePrice(),这个表达式会返回80; 4、访问OGNL上下文(OGNL context)和ActionContext; 5、操作集合对象。Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map的接口.,北京传智播客教育 ,理解Struts2中的 ValueStack,ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础,ValueStack(值栈): 贯
3、穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前Action 对象和其他相关对象. Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中,在 ValueStack 对象的内部有两个逻辑部分: ObjectStack: Struts 把动作和相关对象压入 ObjectStack 中-List ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中 Strut
4、s 会把下面这些映射压入 ContextMap 中 parameters: 该 Map 中包含当前请求的请求参数 request: 该 Map 中包含当前 request 对象中的所有属性 session: 该 Map 中包含当前 session 对象中的所有属性 application:该 Map 中包含当前 application 对象中的所有属性 attr: 该 Map 按如下顺序来检索某个属性: request, session, application,北京传智播客教育 ,理解Struts2中的 ValueStack,理解Struts2中的 ValueStack,理解Struts2中
5、的 ValueStack,Person.java,ValueStackAction.java,理解Struts2中的 ValueStack,理解Struts2中的 ValueStack,在action中的request、session、application对象被封装成了Map集合,理解Struts2中的 ValueStack,复制OgnlContext中的 Object _root的属性,北京传智播客教育 ,理解Struts2中的ValueStack,断点执行如下代码: Object ctx=ServletActionContext.getRequest().getAttribute(“st
6、ruts.valueStack“);,北京传智播客教育 ,理解Struts2中的ValueStack,public class OgnlValueStack implements ValueStack Map context; CompoundRoot root; ,public class OgnlContext implements Mapprivate Object _root;private Map _values = new HashMap(23); ,public class CompoundRoot extends ArrayList,ObjectStack: Struts 把动
7、作和相关对象压入 ObjectStack 中,ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入ContextMap 中. Struts 会把下面这些映射压入 ContextMap 中 parameters: 该 Map 中包含当前请求的请求参数 request: 该 Map 中包含当前 request 对象中的所有属性 session: 该 Map 中包含当前 session 对象中的所有属性 application:该 Map 中包含当前 application 对象中的所有属性 attr: 该 Map 按如下顺序来检索某个属性: request,
8、 session, application,OgnlValueStack 类包含两个重要的属性 一个root和一个context。* 其中root本质上是一个ArrayList.* 而context 是一个Map(更确切的说是一个OgnlContext对象) 在这个OgnlContext对象(context)中,有一个默认的顶层对象 _root,OGNL访问context中这个默认顶层对象中的元素时,是不需要#号的,直接通过元素的名称来进行访问, 而访问其他对象时,如 request、session、attr等,则需要#号引用。注:Struts2将OgnlValueStack的root对象赋值
9、给了OgnlContext 中的_root对象,在OgnlValueStack的root对象中,保存着调用Action的实例,因此,在页面上通过Struts2标签访问Action 的属性时,就不需要通过#号来引用总结:ognl Context包含 ObjectStack属性和ContextMap属性,理解OGNL Context,ObjectStack(root 属性) list集合,Object1,Object2,.,ContextMap(context属性) Map集合,Request Session Application Att parameters,构成OGNL Context,北京
10、传智播客教育 ,理解OGNL Context,OGNL Context是struts2的数据中心 结构示意图如下:,value stack (OgnlValueStack的root属性(List),OGNL Context,parameters,request,session,application,attr,当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action 。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。 注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:,北京
11、传智播客教育 ,理解ActionContext,ActionContext提供了对ognl上下文对象中数据操作的方法.,ServletActionContext.getRequest().setAttribute(“username“, “username_request“);ServletActionContext.getServletContext().setAttribute(“username“, “username_application“);ServletActionContext.getContext().getSession().put(“username“, “username_session“);ValueStack valueStack=ServletActionContext.getContext().getValueStack();System.out.println(“valueStack “+valueStack);valueStack.set(“username“, “username_valueStack“);,