`
asd8313123
  • 浏览: 18976 次
  • 性别: Icon_minigender_1
  • 来自: 韶关
社区版块
存档分类
最新评论

对Struts2 OGNL的分析与简介

    博客分类:
  • java
阅读更多

Struts2 OGNL基础上的增强

1、值栈(ValueStack)

Struts2 OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为Struts2 OGNL的根对象。

我们知道,Struts2 OGNL上下文中的根对象可以直接访问,不需要使用任何特殊的“标记”,而引用上下文中的其他对象则需要使用“#”来标记。由于值栈是上下文中的根对象,因此可以直接访问。那么对于值栈中的对象该如何访问呢?Struts2提供了一个特殊的OGNLPropertyAccessor,它可以自动查找栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象。也就是说,对于值栈中的任何对象都可以直接访问,而不需要使用“#”。

假设值栈中有两个对象:student和employee,两个对象都有name属性,student有学号属性number,而employee 有薪水属性salary。employee先入栈,student后入栈,位于栈顶,那么对于表达式name,访问的就是student的name属性,因为student对象位于栈顶;表达式salary,访问的就是employee的salary属性。正如你所见,访问值栈中的对象属性或方法,无须指明对象,也不用“#”,就好像值栈中的对象都是OGNL上下文中的根对象一样。这就是Struts2在OGNL基础上做出的改进。

2、[N]语法

如上所述,如果想要访问employee的name属性,应该如何写表达式呢?我们可以使用[N].xxx(N是从0开始的整数)这样的语法来指定从哪一个位置开始向下查找对象的属性,表达式[1].name访问的就是employee对象的name属性。

在使用[N].xxx语法时,要注意位置序号的含义,它并不是表示“获取栈中索引为N的对象”,而是截取从位置N开始的部分栈。

3、top关键字

top用于获取栈顶的对象,结合[N].xxx语法,我们就可以获取栈中任意位置的对象。

如:[0].top,[1].top等

4、访问静态成员

除了使用标准的OGNL表达式访问静态字段和静态方法外,Struts2还允许你不指定完整的类名,而是通过“vs”前缀来调用保存在栈中的静态字段和静态方法。

@vs@FOO_PROPERTY@vs@someMethod()@vs1@someMethod()

 

vs表示ValueStack,如果只有vs,那么将使用栈顶对象的类;如果在vs后面跟上一个数字,那么将使用栈中指定位置处的对象类。

标准方法:@类全限定名@静态属性或方法名

< ?xml:namespace prefix = s />< s:property value="@action.SystemInfo@WEB_CONTEXT">< /s:property >

5、值栈中的Action实例

Struts2框架总是把Action实例放在栈顶。因为Action在值栈中,而值栈又是OGNL中的根,所以引用Action的属性可以省略“#”标记,这也是为什么我们在结果页面中可以直接访问Action的属性的原因。

6、Struts2中的命名对象

Struts2还提供了一些命名对象,这些对象没有保存在值栈中,而是保存在ActionContext中,因此访问这些对象需要使用“#”标记。这些命名对象都是Map类型。

parameters

用于访问请求参数。如:#parameters['id']或#parameters.id,相当于调用了HttpServletRequest对象的getParameter()方法。

注意,parameters本质上是一个使用HttpServletRequest对象中的请求参数构造的Map对象,一量对象被创建(在调用Action实例之前就已经创建好了),它和HttpServletRequest对象就没有了任何关系。

request

用于访问请求属性。如:#request['user']或#request.user,相当于调用了HttpServletRequest对象的getAttribute()方法。

session

用于访问session属性。如:#session['user']或#session.user,相当于调用了HttpSession对象的getAttribute()方法。

application

用于访问application属性。如:#application['user']或#application.user,相当于调用了ServletContext的getAttribute()方法。

attr

如果PageContext可用,则访问PageContext,否则依次搜索request、session和application对象。

以上就是对Struts2 OGNL的分析与简介

分享到:
评论

相关推荐

    对 Struts2 OGNL 的分析与简介

    在Struts2框架中,OGNL主要负责视图层与模型层之间的数据传递,使得开发者能够轻松地将后台的数据渲染到前端页面上。 在Struts2中,OGNL的主要用途包括: 1. **Action属性访问**:开发者可以通过OGNL表达式在...

    struts2中的OGNL的源码

    其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...

    Struts2 ognl

    在Struts2中,OGNL作为视图层与控制器层之间的桥梁,负责解析和执行来自Action的请求参数,将它们映射到Action类的属性,同时将Action的结果传递给视图进行渲染。 1. **OGNL的基本语法** OGNL的语法非常灵活,可以...

    struts2 ognl源码

    6. **OGNL与Struts2的集成**: - 在Struts2的拦截器链中,`ognl.OgnlValueStack`拦截器负责处理OGNL表达式的计算和执行。 - `Result`类使用OGNL来设置模型数据到视图模板。 理解Struts2 OGNL的源码有助于我们更...

    Struts2核心包ognl-2的源代码

    Struts2将ActionContext与OGNL结合,使得请求参数可以直接在表达式中使用。 5. **安全特性**:在Struts2中,OGNL的不当使用可能导致安全漏洞,如著名的Struts2 OGNL注入攻击。源代码中包含了对这种风险的防护措施,...

    struts2 OGNL表达式

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它被Struts2框架广泛用于视图层与模型层之间的数据绑定和交互。通过OGNL,开发者可以轻松地访问和操作对象图中的任何属性,实现灵活的数据传递。 ...

    struts2_OGNL Demo

    通过分析这个项目,开发者可以了解如何在实际应用中组织Struts2的Action、配置文件、以及如何利用OGNL进行数据操作。同时,对于使用Eclipse或MyEclipse进行Java Web开发的初学者来说,也是一个很好的学习实例,有助...

    struts2 OGNL

    在Struts2中,OGNL用于Action类与JSP页面之间的数据传递,使得开发者无需编写繁琐的getter和setter方法,提高了开发效率。例如,一个简单的Action类可能包含如下属性: ```java public class UserAction { private...

    struts2对Ognl的封装--PropertyAccessor

    - Struts2中OGNL与Action、ValueStack的关系。 - OGNL的安全性问题,如OGNL注入攻击,以及如何防范。 在压缩包文件`struts-ognl.asta`中,可能包含了一些示例或测试用例,用于演示Struts2中PropertyAccessor的使用...

    struts2对Ognl的封装--TypeConverter

    这篇博客文章"Struts2对Ognl的封装--TypeConverter"探讨了Struts2如何通过TypeConverter机制来增强OGNL的功能。 首先,我们来看一下OGNL。OGNL允许开发者用简洁的语法来获取和设置对象的属性,甚至可以进行复杂的...

    struts2 Ognl表单提交问题

    ### Struts2 OGNL 表单提交问题详解 #### 一、背景介绍 Struts2框架作为一款流行的企业级应用开发框架,在处理MVC架构方面有着独特的优势。其中,OGNL (Object-Graph Navigation Language) 作为一种强大的表达式...

    struts2 ognl

    Struts2 OGNL是一个关于Java Web开发中的关键知识点,主要涉及到的是Apache Struts2框架与Object-Graph Navigation Language(OGNL)的结合使用。Struts2是一个流行的MVC(模型-视图-控制器)框架,它极大地简化了...

    Struts2_OGNL

    在阅读《Struts2_1900_OGNL》这篇博文时,可能你会了解到作者如何分析Struts2的源码,理解OGNL在框架中的作用,以及如何利用工具进行调试和优化。博主可能还会分享如何防止OGNL注入攻击的实践经验和最佳实践。 总之...

    struts2-xwork-ognl的源文件(jar包)

    同时,源代码分析也能帮助开发者避免潜在的问题,如安全漏洞,例如著名的Struts2 S2-045远程代码执行漏洞,就是由于OGNL表达式不当处理导致的。因此,理解和掌握这些源代码不仅能提高开发效率,也有助于增强应用的...

    Struts2 & OGNL

    在这个主题中,我们将深入探讨Struts2与OGNL的整合以及它们在实际开发中的应用。 **Struts2框架概述** Struts2是Apache软件基金会的开源项目,它是Struts1的升级版,提供了更多的特性和灵活性。Struts2的核心设计...

    Struts2漏洞分析与研究之Ognl机制探讨1

    Struts2是一个流行的Java web开发框架,它使用OGNL(Object-Graph Navigation Language)作为其主要的数据绑定和表达式语言。OGNL允许开发者方便地在字符串和对象之间进行交互,从而实现动态的数据操作。本文主要...

    ognl 源码: struts2 所用的 ognl 包源码

    在 Struts2 框架中,OGNL 作为默认的表示层语言,用于视图与模型之间的数据绑定。Struts2 的核心功能之一就是允许开发者通过 OGNL 表达式在 JSP 页面、Action 类以及值栈之间灵活地传递数据。 源码分析: 1. **...

    struts2漏洞分析

    struts2漏洞分析,介绍了最近发现的struts2的漏洞。并详细解释了该漏洞产生的原因。

    Struts2中的OGNL

    了解Struts2与OGNL的结合,可以通过阅读Struts2的源码来深入理解其工作原理。这包括`org.apache.struts2.util.OgnlValueStack`、`org.apache.struts2.components.UIBean`等类,以及`ognl`库中的相关实现。 6. 开发...

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

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

Global site tag (gtag.js) - Google Analytics