`

Struts2 OGNL

阅读更多

众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action

配置参数、向其他Action传递属性值(通过chain结果)等等。要获得这些参数值,我

们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action

类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

  要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯

穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当

Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用

Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点

(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的

属性值为null,int类型的属性值为0等。

  在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦

截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将ValueStack

对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带

来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack

对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最

后改变该属性的这个值。

  从上面的描述很容易知道,在Struts 2的的Action类可以获得与属性同名的参数值

就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配

置参数的拦截器是staticParams等。在这些拦截器内部读取相应的值,并更新

ValueStack对象顶层节点的相应属性的值。而ValueStack对象就象一个传送带,将属性

值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传

到Action对象,并将ValueStack对象中的属性的值终值赋给Action类的相应属性


无意中发现,属性没有写set get 方法,依然会注入值和取到值.

甚是不解,求助于网上依然没有得到解决!

花了点时间看了下源码!

发现:

struts2 参数拦载器在注入值的时候,有两种机制,(调用ognl)

这是OgnlRuntime 类中一段源码 hasSetMethod( context, target, targetClass,

name ) || hasField( context, target, targetClass, name );

他会先查看你的action 中有没有对应的方法,如果发现无此方法,他会利用第二种方法

直接给属性覆值,而无需对应的set方法!(当然都是通过反射机制实现的)

如果action 中属性过多的话,我觉得就不用写set get 方法了!(不知道这个会不会给以

后维护带来问题).

 

 

个人总结:OGNL中的值栈相当于一个数据的中转站,或者叫数据的缓冲存储中心。另外,OGNL除了有值栈(VS)这个特别的对象外,它的表达式语言也自成一派。

分享到:
评论

相关推荐

    Struts2 ognl

    Struts2 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它在Struts2框架中扮演着核心角色,用于数据绑定、控制流程以及动态方法调用。这篇博文可能详细介绍了Struts2框架中OGNL的使用、工作原理...

    struts2 ognl的用法

    ### Struts2中OGNL的使用详解 #### 一、OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取或设置一个对象图中的属性。它在Struts2框架中扮演着极其重要的角色,是Struts2实现...

    struts2 ognl用法项目

    在这个“Struts2 OGNL用法项目”中,我们将深入探讨OGNL(Object-Graph Navigation Language),它是Struts2中一个强大的表达式语言,用于在模型对象和视图之间进行数据绑定和表达式计算。 OGNL是Struts2的核心组件...

    struts2 ognl源码

    OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于在Action对象和视图之间传递数据。在这个主题中,我们将深入探讨Struts2 OGNL2.6.11的源码,了解其内部工作原理和关键功能。 首先,...

    struts2 OGNL表达式

    Struts2 OGNL表达式是Java开发中一个重要的知识点,尤其在Web应用程序设计中扮演着核心角色。OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它被Struts2框架广泛用于视图层与模型层之间的数据...

    struts2 ognl表达式

    Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...

    struts2 OGNL表达式使用

    struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...

    struts2 OGNL语言学习笔记

    Struts2 OGNL语言学习笔记 OGNL(Object-Graph Navigation Language)是 Struts 2 中的一种表达式语言,主要用于简化 JSP 页面中的编码,使页面与后台代码分离。下面是 OGNL 语言的主要特点和用法: 1. 支持对象...

    Struts2 OGNL标签详解析实例

    Struts2 OGNL---标签详解析 都有实例 适合初学者

    struts2中的OGNL的源码

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

    Struts2 OGNL示例(Maven项目)

    这个"Struts2 OGNL示例(Maven项目)"提供了使用OGNL与Struts2集成的实例,帮助开发者更好地理解和应用这一强大的特性。 首先,让我们了解什么是OGNL。OGNL是一种强大的表达式语言,允许我们访问和修改对象图中的...

    Struts2核心包ognl-2的源代码

    这个压缩包包含的是OGNL的2版本的源代码,这对于理解Struts2框架的工作原理以及OGNL语言的实现细节非常有帮助。 OGNL的主要功能是提供一种简洁的方式来获取和设置对象的属性,甚至可以处理复杂的对象图。例如,你...

    struts2 OGNL 详细教程

    关于struts2 OGNL 详细教程,对初学者有帮助

    struts2 OGNL 表达式及各种标签的使用

    Struts2 OGNL(Object-Graph Navigation Language)表达式是一种强大的、动态的数据绑定和脚本语言,广泛应用于Struts2框架中。它允许开发者在视图层与模型层之间灵活地传递数据,增强了MVC架构中的灵活性。本文将...

    struts2 ognl

    8. **Struts2中的OGNL拦截器**:Struts2框架使用了一系列拦截器来增强OGNL的功能,例如ValueStack,它可以将Action上下文中的所有对象暴露给OGNL表达式。这使得在视图层直接访问Action的属性变得简单。 总的来说,...

    struts2 OGNL

    Struts2 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,广泛应用于Apache Struts2框架中,用于在视图、控制器和模型之间进行数据的表达和操作。Struts2是Java Web开发中最流行的MVC框架之一,而...

    struts2 Ognl表单提交问题

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

    struts2 ognl源文件

    struts2 ognl源文件 在ECLIPSE导入后可方面的利于开发

Global site tag (gtag.js) - Google Analytics