资源描述:
《笔记_struts_ognl_标签》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、笔记_struts_OGNL_标签OGNL教程OGNL简单特性模拟OGNL简单的实现OGNL入门OGNL原理一角OGNL学习http://keyboardsun.javaeye.com/blog/434677OGNL使用手记(在java中使用)http://wtnhwbb.javaeye.com/blog/107683----------------------------------------------------------------------------一.OGNL是ObjectGraphicNavigationLanguage(对象图导航语言)的缩写,它是一个开
2、源项目.Struts2框架使用OGNL作为默认的表达式语言.1.与EL表达式相比,它提供了平时我们需要的一些功能,如:(1).支持对象方法调用,如:xxx.sayHello();(2).支持类静态方法的调用和静态属性访问,表达式的格式为:@[类全名(包括包路径)]@[方法名
3、属性名],例如:@java.lang.String@format('foo%s','bar')或@cn.itcast.Constant@APP_NAME;(3).操作集合对象.*2.页面中直接使用jstl/EL,而不使用ognl表达式(1).后台中:ActionContext.put(...);--把要在j
4、sp中显示的数据放到值栈中(2).jsp页面中:${...}--Struts2中默认就是从值栈中取值的二.OGNL上下文1.OGNL有一个上下文(Context)概念,说白了,上下文就是一个Map结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面就是上下文(ActionContext)的结构示意图:
5、-----ValueStack(值栈,它是根对象)
6、
7、-----parameters
8、
9、-----request
10、OGNLContext(ActionContext)---
11、-----session
12、
13、
14、-----application
15、
16、-----attr
17、
18、-----...(可以把对象加到ActionContext中,如页面中的struts的set标签)注:当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action.然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问.2.(1).访问上下文(Context)中的对象需要使用#符号标注命名空间,如:#session,#application(2).另外OGNL会设定一个根对象(root对象),在Sturts2中根对象就是ValueStack(
19、值栈).如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可.(3).在Struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象.在OgnlValueStack类里有一个List类型的root变量,就是使用它存放一组对象的.
20、-----ValueStack:root变量:List[action,OgnlUtil...]
21、
22、-----parameters
23、
24、-----request
25、OGNLContext(ActionContext)---
26、-----s
27、ession
28、
29、-----application
30、
31、-----attr注:在root变量中处于第一位的对象叫栈顶对象.通常我们在OGNL表达式里直接写属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找.如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止(找不到返回null)注:Struts2中,OGNL表达式需要配合Struts标签才可以使用,如:注:在ValueStack中找的是对象(如action)的属性,在#request中找的是对象.3.访问:
32、(1).由于ValueStack(值栈)是Struts2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接用下面的EL表达式访问ValueStack(值栈)中的对象的属性:${foo}//获取值栈中的某个对象的foo属性.注:为何使用EL表达式能够访问ValueStack中对象的属性?(jsp中EL表达式只能从pageScope,requestScope,sessionScope,applicationScope中取值)原因是Struts2对HttpServletRequ