`

struts2 ognl 原理

 
阅读更多

Struts2内置了OGNL这是大家都知道的了,其实这种说话不严格,应该OGNL本身是一种很强大的表达式语言,XWork整合了OGNL的一部分并且将这部分内容做了相应的扩展,而Struts2又建立在XWork这个项目的基础之上,所以Struts2也就内置了OGNL这部分强大的功能。

        为了详细些一步一步做记录吧。

        先说OGNL,OGNL内部自己会维护一个OGNL上下文(OgnlContext)是一个实现了Map接口的对象,OGNL会将对象放在这个上下文中统一管理的,并且会有一个对象被指定为根对象(root)。假设有User和Customer这么两个类,分别有user和customer两个实例,这两个对象都有一个name属性,并且将user对象配置为唯一的根对象,那么就会有下面的情况:

#user.name                    返回user.getName();

#customer.name            返回customer.getName();

#name                            返回user.getName();        因为user对象为根对象

OGNL访问对象的基本机制就是这样的。

        在XWork中,ValueStack对象是上下文中的根对象,XWork中不仅可以根据表达式从ValueStack对象中获取对象,还可以获取对象的属性,XWork自己有一个强大的属性访问器,它可以自动搜索栈内的所有实体(从上到下),直到找到你所访问的对象和属性。假设ValueStack栈中有两个上面所说的user和customer两个对象,并且user是栈顶元素,customer在下面,就会有下面的情况:

name                            返回user.getName();  因为user在栈顶,搜索器找到一个匹配的属性就不会继续找下去

如果希望访问靠后对象的属性XWork提供了索引访问ValueStack的方法:

[0].name         返回user.getName()

[1].name         返回customer.getName();

        了解上面这些之后Struts2中的OGNL就很好理解了,Struts2框架也没有对XWork中的OGNL做太大的修改,只是拿过来做了一下整合工作,Struts2将ActionContext设置为OGNL中的上下文,ValueStack依然是OGNL上下文中的根元素,大家知道application,session和request这几个对象也是在ActionContext中的,它们是和根对象ValueStack共存的,与根对象是无关的,就像刚开始说OGNL那个例子实在OGNL上下文中的两个平行对象,只不过ValueStack这个对象是这个OGNL上下文中的根对象(root)。如果要访问上下文中根对象中的对象和属性是不用加任何标记符号的,但是在访问application,session和request这几个范围内的对象和属性就要用"#"符号来告诉ognl不要在根对象中去搜索了,而是去我们指定的上下文中去找。用官方一个图来形象描述ValueStack和其他几个对象的关系:

                     |--request
                     |
                     |--application
                     |
            context map---|--OgnlValueStack(root)
                     |
                     |--session
                     |
                     |--attr
                     |
                     |--parameters
 

        基本原理就是这样了,举例验证理论。

1. ActionContext是OGNL的上下文,ValueStack对象是上下文中的根对象:

    随便找一个Action给JSP页面传东西过去的例子,然后在Action的execute()方法中加入以下代码:

    ActionContext.getContext().getValueStack().set("test", "love java");

    在目标JSP页面空白处加上如下代码:

    <s:label value="%{test}"></s:label>

再次跳转到该页面就可以看到love java出现在页面上了

2. 其他范围和ValueStack平行关系:

    还找刚才那个例子,在Action中加入

    request.setAttribute("test1", "love java1");

    在JSP页面加入代码:

    <s:label value="%{#request.test1}"></s:label>

这次跳转就可以看到love java1出现了

3. OGNL上下文的访问

    Action中加入代码:

    ActionContext.getContext().put("test2", "love java2");

    JSP页面中加入:

    <s:label value="%{#test}"></s:label>

看到love java2之后应该大彻大悟了吧,这里值得说一下就是在ActionContext.getContext().put("test2", "love java2")之后上下文结构:

                     |--request
                     |
                     |--application
                     |
            context map---|--OgnlValueStack(root)
                     |
                     |--session
                     |
                     |--attr
                     |
                     |--parameters
                     |
                     |
                     |--test2
                   
这样更清楚了吧!

总结:

    1.  在JSP页面中"%{"就表示OGNL表达式开始,"}"表示OGNL表达式结束

    2.  如果访问根对象中的对象和属性不用任何符号标志,如:%{Object.field}

    3.  访问特定Scope中的对象和属性用"#"来通知OGNL查询器,如:%{#request.object},当然OGNL很强大,在一个链中,前一个对象做为解释下一个对象的上下文。你可以任意扩展这个链,在链中也可以访问对象中的方法。

分享到:
评论

相关推荐

    struts2中OGNL的一些概念及原理说明

    关于struts2中ognl的说明、原理及使用,对于初学者进阶是个不错的参考

    学习OGNL在Struts2中工作原理

    学习OGNL在Struts2中工作原理学习OGNL在Struts2中工作原理学习OGNL在Struts2中工作原理学习OGNL在Struts2中工作原理

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...

    struts2技术内幕+struts2权威指南

    核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...

    struts2 技术内幕——深入解析struts2架构设计

    核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...

    Struts2深入学习----OGNL表达式原理

    NULL 博文链接:https://z-one.iteye.com/blog/1584602

    Struts2技术内幕.pdf

    核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...

    struts2 学习重点笔记

    这是学习struts2时记得重点笔记,包括了一些原理,ognl语句的编写,以及如何设置拦截器等等一些基本知识,起到复习和巩固的作用

    Struts2 in action中文版

    1.3.3 Struts 2的工作原理 12 1.4 小结 14 第2章 初识Struts 2 16 2.1 声明性架构 16 2.1.1 两种配置 16 2.1.2 声明架构的两种方式 17 2.1.3 智能默认值 20 2.2 简单的HelloWorld示例 20 2.2.1 部署示例应用程序 20...

    Struts2入门教程(全新完整版)

    十二、总结 本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例。 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图...

    struts2讲义_吴峻申

    5.1 Struts2标签使用原理解疑 73 5.2 OGNL表达式语言介绍 75 5.3 Struts2控制标签简介 79 5.3.1 append标签使用介绍 79 5.3.2 generator标签使用介绍 80 5.3.3 if、else、elseif标签使用介绍 81 5.3.4 iterator标签...

    Struts2练习Demo以及随笔

    Struts的开发步骤、OGNL、ValueStack、Action核心、Result基本原理、Struts2核心标记库、Struts2拦截器、自定义拦截器、UI标记、非UI标记、资源文件国际化等等实例全面使用。

    struts2学习ppt

    掌握Struts2原理、基本配置及使用 掌握Struts2核心解析、国际化、类型转换、输入校验、OGNL、Struts2标签库 了解AJAX技术支持 掌握文件的上传与下载。 深入理解MVC与Struts之间的关系,并使用基本MVC和Struts进行项目...

    struts2学习demo及ppt

    本资源包含了struts2的原理,配置,struts2的标签,拦截器,struts2的上传,下载,以及ognl表达式的用法,各部分内容均有demo,对于初学者来说能够提供很好的帮助 demo中如缺少struts2的jar请自行到官网下载

    struts2详细介绍经典

    该资源包含了所有struts2的知识点,从基本的配置到拦截器再到ognl的值栈,应有尽有,很值得一看,对于刚学过struts2的同学,看看可以更深刻的理解其中的原理。

    精讲Struts2

    精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) 上传 下载 OGNL(ActionContext StackContext ValueStack区别)

    structs2教程

    structs2教程,重点介绍了Struts2入门及基本配置 Struts2核心概念及原理 Struts2输入校验 Struts2实现文件上传及下载 Struts2深入探索 Struts2的拦截器 Ognl语言 Struts2标签

    struts.docx

    Struts2是处理访问服务器的请求 学习struts2的(重点) Struts.xml的配置 参数传递 Ognl ValueStack Action原理 Result原理 拦截器 struts将会完全的取代我们的servlet技术

    Struts2和Webwork远程命令执行漏洞分析1

    原理简介:1、用户提交了\u0023被转义为\\u0023,通过了对参数名称的验证后,最终ognl处理之前,又变成了\u0023,也就是#,符合了ognl语法。

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

Global site tag (gtag.js) - Google Analytics