转载:OGNL & ValueStack 入门

转载地址:http://www.iteye.com/topic/223612
h1. 一个例子
请看下面的需求,假设有如下用户对象模型:
Java代码
public interface User {  
public String getName();
public Date getRegisterDate();
public Customer getCustomer();
}
public interface Customer {
public String getId();
public String getName();
public boolean isVip();
}
public interface EntCustomer extends Customer {
public String getTrustId(); // 组织机构代码证号
}

对于给定的用户jack,且该用户所属客户是企业客户,那么我们如何获取该用户的姓名?如何获取用户所属客户的名称?如何判断该用户所属客户是否是VIP客户?如何取jack所属企业的组织机构代码证号?

* 采用java代码的方式,我们可以用如下的API调用得到所需信息:
Java代码
jack.getName();  
jack.getCustomer().getName();
jack.getCustomer().isVip();
((EntCustomer)jack.getCustomer()).getTrustId();



* 但我们现在在讲述OGNL,因此通过采用OGNL,我们可以用如下方式取得我们所需要的信息:
Java代码
jack.name  
jack.customer.name
jack.vip
jack.customer.trustId

由此我们可以看到OGNL的表达方式与java表达方式有以下几点不同:
** 不需关注对象类型,不需进行类型转换
** 表达方式更简短和直观

OGNL表达式最大的优点就是:*简单* 和 *直观*,你不这样认为吗? 如果你觉得上面的表达式还不够简单和直观,那我们再来看:
Java代码
name

这也是一个OGNL表达式,也就是取姓名!简单吗?至少足够直观了吧:)

h1. 基本概念
我们前面看到了OGNL的一个最简单的例子,事实上OGNL确实很简单,如果能理解上面那个例子的用法,那么我们就掌握了OGNL的80%的用法了。
上面的例子虽然简单,但其中却含有OGNL的两个最基本的概念:*表达式(expression)* 和 *上下文(context)*,我们先看*表达式*。

h3. 表达式
OGNL就是表达式!它能让我们用简洁直观的语法表达我们的想法,如同上面的例子一般。简洁直观就是表达式的最大优点!我们知道表达式总是有一个结果,也就是说表达式总是会求值出一个结果,这个结果可能是一个字符串(如名称、组织机构代码证号等),或者是一个布尔值(如是否是VIP客户等),至于这个结果要怎么使用,那就是我们自己来决定的了。

h3. 上下文(context)
表达式的概念,我相信很好理解,但什么是上下文(context)?简单来说上下文就是环境,表达式求值的环境!还是不理解吗?我们来看一个例子:
还是上面最后那个例子:
Java代码
name
细心的你是否会问,这个表达式要取谁的姓名呢?OK,很好!这就是环境,"谁"就存在于环境之中,也就是存在上下文之中。对于不同的环境/上下文,相同的表达式会有不同的结果!而环境/上下文的实质是什么呢?就是一组带名称的对象集合。
引用
思考:表达环境或上下文这个概念的最好的数据结构是什么?


h3. OGNL上下文概念详解
我们前面说上下文就是一组名称-对象对的集合,如下图所示就是一个简单的上下文:
Java代码
user ---> User(name:"jack", ...)
request ---> HttpServletRequest(header: ...)

那么在上面的环境中,我们可以有如下的OGNL表达式:
Java代码
#user.name // 取用户的姓名  
#user.age // 取用户年龄
#user.birthday // 取用户生日
#user.customer.name // 取用户所属客户的名称
#request.parameters // 取请求参数


请注意上面表达式中的"#user"和"#request"的用法,"#"表示访问环境/上下文中的对象。

现在可以很方便地访问环境中的对象了,那么如果你比较懒惰的话(记住:在程序员群体,懒惰是褒义词!),你是否觉得访问用户的姓名,年龄,生日,等等其它属性如果全部要使用"#user"来访问会不会太麻烦了呢?OK,ONGL的设计者早就考虑了这个问题,我们可以指定user为环境中的特权对象,访问该对象可以不需要使用#user的方式,如下所示代码与上面的完全等价,当然,前提是要预先指定user为特权对象:
Java代码
name // 取用户的姓名  
age // 取用户年龄
birthday // 取用户生日
customer.name // 取用户所属客户的名称
#request.parameters // 取请求参数



我们上面所说的"特权对象"在OGNL中称为"根对象"(root)

h3. 小结
综上所述,理解OGNL表达式的关键是理解其上下文的概念,因为OGNL的上下文概念中引入了"根对象"的概念,所以初学者往往会在这里迷失方向。

引用

OGNL的中文全称是对象图导航语言,也就是说OGNL是一门语言,如同java是一门语言一样。你是否会认为OGNL的作者太夸张了,竟敢把表达式谎称为语言?不,OGNL的语法确实非常简洁,OGNL的代码(我没有说表达式,因为代码是和语法相匹配的词语)通常不会换行,这意味着我们不可能把OGNL的代码写得很长,但是,这并不意味着OGNL的表达能力很弱。事实上,OGNL的语法设计非常简洁,但其功能却相当强大,如果你有兴趣,可以深入阅读OGNL参考手册的集合与lambda章节。


慢着,事情还未至此结束!struts2对OGNL中的上下文的概念又定义了新的含义,且听我慢慢道来!

h3. struts2中的OGNL上下文
struts2对OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示:
Java代码
|  
|--request
|
|--application
|
context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]
|
|--session
|
|--attr
|
|--parameters


我们可以使用"#requet"访问HttpServletRequest对象, "#session"访问HttpSession对象,但请注意"根对象"是什么?是ValueStack!
那么ValueStack是什么?值栈。也就是一组对象的堆栈。也就是说,在struts2中,根对象不是我们通常的一个对象,而是一组对象。我们可以push新的对象到值栈中,也可以弹出值栈的栈顶对象。如上图所示,假设我们将user对象push到值栈中,那么如下的表达式将与之前我们见过的表达式一样,具有相同的结果:
Java代码
name // 取用户的姓名  
age // 取用户年龄
birthday // 取用户生日
customer.name // 取用户所属客户的名称
#request.parameters // 取请求参数

也就是说,我们使用name这个表达式的时候,ONGL会取"根对象"的name属性,但现在根对象是ValueStack!那么访问ValueStack的name属性意味着什么呢?这意味着: ValueStack会先查看栈顶元素是否有name属性,如果有就返回该属性值,否则取出栈顶下的元素,继续查看,直到栈底为止。

以上就是OGNL表达式的核心概念,你理解了吗?下一步,你需要了进一步了解OGNL的语法,以发掘其更强大的功能!
Genesis物理引擎实战指南:轻量级确定性刚体仿真核心 刚体物理仿真作为机器人控制、嵌入式运动学验证和确定性游戏开发的基础技术,其核心在于数值稳定性、跨平台可复现性与约束求解精度。本文围绕线性互补问题(LCP)求解、半隐式欧拉积分和零依赖C++实现三大关键技术展开,解析如何在无GUI、低算力环境下构建可单步调试、帧级可控的确定性仿真系统。重点覆盖碰撞检测数学建模、关节局部坐标系绑定、质量-惯性张量一致性校验等工程落地关键点,适用于STM32、树莓派及教育实验场景。内容深度结合Genesis Physics Engine的源码实践,直击‘穿模’‘NaN’‘关节发软 阅读详情

相关推荐

微信h5 支付,已经获得weixin://wap/pay?prepayid,但是无法调起微信客户端支付

结果几个接口,最终获得到到一直包含调起微信客户端的支付链接 但是直接打开这个页面,却不能调起微信客户端支付,原因是,在打开新页面的时候,需要设置a.rel = "noreferrer"; <body> <a href="javascript:void(0)" onclick="openNewWindowNoreferrer(this)">点击支付</a&...

qq_31683775的博客 4万+

ValueStack---对OGNL的扩展

valueStack 是xwork用以对OGNL的计算进行扩展的一个特殊的数据结构。 实际上是对OGNL三要素中的Root对象进行扩展。1,ValueStack从数据结构的角度被定义为对象的集合,2.ValueStack规定自身这个集合的所有对象,在进行OGNLj计算时被视为Root对象。ValueStack的数据结构特征是栈结构。 ValueStack Struts2是通过Va

yansuoo的博客 916

一文学会Cadence Sigrity PDN仿真——硬件新手小白都能看懂的保姆级教程

电源完整性的仿真,实际上是在仿真以及优化系统中的等效串联电阻。知道了仿真以及优化的目标之后,接下来就是要弄明白这个串联电阻从哪儿来以及怎么优化。整个系统中的串联电阻实际上由三部分组成:没有相位的阻抗,有相位的容抗和感抗,得益于相位,在某个特定的频点,容抗和感抗会大小相等,相位相反而相互抵消,这时候整个系统中就剩下了阻抗,所以整个系统的串联电阻达到了一个最低值,这种现象就是----谐振。当系统处于谐振点时候,整个系统会有一个最小的串联电阻,所以第一个优化电阻的手段就是让谐振来的更频繁一点。

学习帮的博客 2万+

关于ValueStack的介绍

当Action设置了某个属性值后,struts2将这些属性值全部封在一个叫struts.valuestack的请求属性里。在JSP页面中输出需要的信息可以通过如下代码来获取包含全部输出信息的ValueStack对象 request.getAttribute("struts.valuestack"); 可以通过OGNL表达式非常方便的访问该对象封装的信息。 从数据结构上看,ValueStack有点类似于Map的结构,但它比Map结构更加强大。Action中所有的属性都被封装到了ValueSt...

py编程|爱分享 1万+

第二章-Ethernet/IP基本概念

在I/O连接中,一旦连接建立,就不会有请求-响应数据,只会按照连接建立时指定的生产触发器所确定的时间间隔生产和消耗带有ConnectionID的数据。连接是通过连接管理器对象的Forward请求服务建立的,ForwardOpen请求包含所有连接参数,包括传输类、生产触发器、定时信息、电子密钥和连接ID。I/O适配器:I/O适配器从I/O扫描器接收隐式通信连接请求,然后以请求的速率生成I/O数据。I/O扫描器:启动与I/O适配器的隐式通信,需要处理连接的配置以及如何配置适配器。扫描器还支持启动显式报文。

_Nooice的博客 1233

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

蜗牛的专栏 3435

Struts2 OGNL表达式、ValueStack

OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性,不能调用对象的方法。 OGNL可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图。 OGNL是可以单独使用的。OGNL并不属于Struts2,只不过S...

weixin_30895603的博客 188

基于vue2的echarts3D地球

采用vue2+js实现了echarts3D地球的放大、缩小和旋转

qq_44699269的博客 1132

浅析Struts2中的OGNL和ValueStack

当Struts2接收到一个.action的请求后,会先建立Action类的对象实例,并且将Action类的对象实例压入ValueStack对象中(实际上,ValueStack对象相当于一个栈),而ValueStack类的setValue和findValue方法可以设置和获得Action对象的属性值。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

2301_77783312的博客 648

ADC噪声参数博弈论:为何24位ADC的有效分辨率可能不如16位?

本文深入探讨了ADC噪声参数的核心矛盾,揭示了24位ADC有效分辨率可能不如16位ADC的根本原因。关键在于跳出单纯比较位数的误区,转而关注输入参考噪声这一绝对指标。文章通过分析参考电压对满量程范围和噪声模型的影响,阐述了动态范围与最小可测信号之间的取舍逻辑,为工程师提供了基于系统实际需求的ADC选型与噪声评估框架。

snow3的博客 704

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用)

影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。

此星光明博客 3107

Struts2-Ognl表达式与ValueStack

Struts2-Ognl表达式与ValueStackOgnl概述OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。Ognl表达式与El表达式的对比: * El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用) 即应用范围更广。 * Ognl表达式语言

motionEnabled 769

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

Struts OGNL and ValueStack

ValueStack基础:OGNL(Object Graphic Navigatino Language)  OGNL是Struts2中使用的一种表达式语言。  它可以用于,在JSP页面,使用标签方便的访问各种对象的属性;  它可以用于,在Action中获取传递过来的页面中的参数(并进行类型转换);  它还可以用在struts2的配置文件中!  所以,非常有必要理解OGNL的基本机制

Mr.Zhou 501

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Struts2_ValueStack,OGNL详解

一、ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用         实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.     2.ValueStack贯穿整个action的生命周期,每一个action实例

欢迎关注免费星球ComfySpace:https://t.zsxq.com/19H0cfM1O 9114

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ValueStack相关知识(OGNL)

一.ValueStack ValueStack是保管和请求相关的所有数据的一个存储区域。Struts2将所有的数据集中在一起,而不是将数据传来传去。在动作执行过程中,数据在ValueStack这里被操作,当结果呈现的时候,数据从这里被取出。 对于ActionContext,则是一个更大范围的数据容器,它即包括了ValueStack,也包括了请求对象,会话对象等等。 二.OGNL 1.O

NoN_o的专栏 718

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OGNL表达式和ValueStack值栈

1.OGNL简介           OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。        Struts2框架内置了OGNL,OGNL本身也是一个项目,它是可...

sinat_42576042的博客 442

ognl与valueStack(重点)

ognl是什么,它有什么用 ognl是Object-garph Navigation Language的缩写,它是一种功能强大的表达式语言 比EL表达式功能强大 struts2将ognl表达式语言,集成到struts2框架当中,作为它的默认表达式语言。 OGNL 提供的五大类功能 1.支持对象方法的调用,如xxx.doSomeS...

cherry_vicent的专栏 324

ognl valueStack

理解ValueStack的基本机制  ValueStack基础:OGNL(Object Graphic Navigatino Language)  OGNL是Struts2中使用的一种表达式语言。  它可以用于,在JSP页面,使用标签方便的访问各种对象的属性;  它可以用于,在Action中获取传递过来的页面中的参数(并进行类型转换);  它还可以用在struts2的配置文件

黄俊东的专栏 1528

Struts2中的OGNL表达式和ValueStack

根据 OGNL 表达式去 Root 区或者 Context 区找数据。访问不同区域的数据,OGNL 表达式的语法有区别,Context 区需要在 key 前面加上 # 才能访问。 Struts 2 把 OGNL 工具中的结构改动了一下,把原来 Root 区换成 ObjectStack 区,这样就可以放入更多的 Object 对象。 ValueStack 有两个属性 root 和 context,root 是 CompoundRoot 实例,而 CompoundRoot 是继承自 ArrayList 的子.

liaowenxiong的博客 584

Struts2 OGNL valueStack

总结一: ActionContext是Action的资源环境,每一次Action请求都会创建一个新的ActionContext,并且每一个ActionContext都是不同的(一次Action请求完毕,对应的ActionContext即销毁。但是,如果请求是在两个action之间转发而不是重定向,则任然用的是同一个ActionContext对象)。 ActionContext中包含:reque

jinsong1213的专栏 610

OGNL

OGNLOGNL的概述EL表达式与OGNL的比较 OGNL的概述 OGNL中文名对象图导航语言,是一个比EL表达式更加强大很多倍的语言 EL表达式与OGNL的比较 EL:从域对象中获取数据,从EL的11个对象中获取数据 OGNL:可以调用对象的方法,可以获取Struts2的值栈数据 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以...

JAVA & HTML 3220

ognl与valueStack(重点)

1.ognl与valueStack         ognl中有一个OgnlContext,它可以设置root与非root .root中数据获取时,不需要加#,而非root中数据在获取时,需要加上#.              重点:学习struts2中使用ognl时,最后要知道 谁是OgnlContext,谁是root,谁是非root.          --------------------...

漫漫学习成长之路 295

Strust2 ognl 和 valueStack详解

Struts ognl 和 valueStack详解OGNLOGNL简介EL和OGNL的区别IGNL两大方法OGNL三要素Context 上下文对象值栈 ValueStack值栈的数据结构值栈findValue方法获取值的套路valueStack的赋值套路 OGNL OGNL简介 OGNL(ObjectGraphic Navigation Language)对象图导航语言,它是一个开源项目。 S...

qq_43059674的博客 378

关于Struts2 中OGNL/值栈ValueStack的学习

1. OGNL OGNL(Object-Graph Navigation Language,对象图导航语言)是一种强大的表达式语言,用于引用和操作值栈上的数据,还可用于数据传输和类型转换,使用它可以存取任意属性,调用对象中的方法。其作用的就是为了简化访问对象中的属性值。OGNL非常类似于JSP表达式语言。OGNL表达式的解析都是围绕OGNL上下文进行的,OGNL表达式是一个map对象,其中包含多...

jcs1992的博客 278

简单理解OGNL、ActionContext、ValueStack

Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。 可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。 Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。 OGNL中重要的3个符号:#、%、$: 1.#符号 #符号的用途一般有三种。

老杨的专栏 1156
上一篇: 常用log4j配置
下一篇: 转载:Struts2源码分析--请求处理
hacker5077
博客等级 码龄18年 67粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hacker5077

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值