Ognl的扩展点:
http://java12345678.iteye.com/blog/2031790
类OgnlValueStack 是struts2对Ognl的封装,提供了表达式取值或赋值方法,并不像ognl那样需要在方法参数中传递context,root 对象,因为context 、root对象已封状在OgnlValueStack 内部
Struts 对Ognl的封装,提供了setValue、set、setParameter等方法通过表达式赋值,findValue,findString 等方法取值。
构建器调用setRoot方法构建OgnlValueStack对象,并生成Ognl需要的相关对象:
protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accessor, CompoundRoot compoundRoot, boolean allowStaticMethodAccess) { this.root = compoundRoot; this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess); this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess); context.put(VALUE_STACK, this); Ognl.setClassResolver(context, accessor); ((OgnlContext) context).setTraceEvaluations(false); ((OgnlContext) context).setKeepLastEvaluation(false); }
1.ognl上下文:Map<String,Object> contex
this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess);
2. ognl的root对象:CompoundRoot root=CompoundRoot :,表达式从中取值或赋值
3:MemeberAccess: ognl的成员是否可以访问(SecurityMemberAccess)
this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess);
4.ognl的ClassResolver(用于加载类)(CompoundRootAccessor)
Ognl.setClassResolver(context, CompoundRootAccessor);
5.ognl的TypeConverter 用于类型转换(new OgnlTypeConverterWrapper(XWorkConverter))
6.PropertyAccessor
由工厂ValueStackFactory生成实例时,注入Container时,调用OgnlRuntime.setPropertyAccessor
7.MethodAccessor
由工厂ValueStackFactory生成实例时,注入Container时,调用OgnlRuntime.setMethodAccessor
8.NullHandler
由工厂ValueStackFactory生成实例时,注入Container时,调用OgnlRuntime.setNullHandler
ValueStackFactory类的方法:
@Inject public void setContainer(Container container) throws ClassNotFoundException { Set<String> names = container.getInstanceNames(PropertyAccessor.class); for (String name : names) { Class cls = Class.forName(name); if (cls != null) { if (Map.class.isAssignableFrom(cls)) { PropertyAccessor acc = container.getInstance(PropertyAccessor.class, name); } OgnlRuntime.setPropertyAccessor(cls, container.getInstance(PropertyAccessor.class, name)); if (compoundRootAccessor == null && CompoundRoot.class.isAssignableFrom(cls)) { compoundRootAccessor = (CompoundRootAccessor) container.getInstance(PropertyAccessor.class, name); } } } names = container.getInstanceNames(MethodAccessor.class); for (String name : names) { Class cls = Class.forName(name); if (cls != null) { OgnlRuntime.setMethodAccessor(cls, container.getInstance(MethodAccessor.class, name)); } } names = container.getInstanceNames(NullHandler.class); for (String name : names) { Class cls = Class.forName(name); if (cls != null) { OgnlRuntime.setNullHandler(cls, new OgnlNullHandlerWrapper(container.getInstance(NullHandler.class, name))); } } if (compoundRootAccessor == null) { throw new IllegalStateException("Couldn't find the compound root accessor"); } this.container = container; } }
OgnlValueStack提供的findxxx方法,通过表达式取值,都会调用如下:
private Object tryFindValue(String expr) throws OgnlException { Object value; if (defaultType != null) { value = findValue(expr, defaultType); } else { value = getValueUsingOgnl(expr); if (value == null) {//在ognl中没有找到 value = findInContext(expr);//到上下文中查找 } } return value; } /** *使用Ognl获取表达式的值 参数contxt上下文,root对象 **/ private Object getValueUsingOgnl(String expr) throws OgnlException { try { return ognlUtil.getValue(expr, context, root); } finally { context.remove(THROW_EXCEPTION_ON_FAILURE); } } /** * ognlUtil类中的方法 * 使用Ognl获取表达式的值 */ public Object getValue(String name, Map<String, Object> context, Object root) throws OgnlException { return Ognl.getValue(compile(name, context), context, root); } /** *从上下文的Map对象中直接get */ private Object findInContext(String name) { return getContext().get(name); }
OgnlValueStack提供的setParameter和setValue方法,通过表达式赋值,都会调用如下:
相关推荐
"struts2对Ognl的封装--PropertyAccessor"这个主题主要涉及Struts2框架如何处理OGNL表达式,特别是如何通过PropertyAccessor接口来访问和操作对象的属性。 首先,我们来了解什么是OGNL。OGNL是Struts2的核心组件之...
这篇博客文章"Struts2对Ognl的封装--TypeConverter"探讨了Struts2如何通过TypeConverter机制来增强OGNL的功能。 首先,我们来看一下OGNL。OGNL允许开发者用简洁的语法来获取和设置对象的属性,甚至可以进行复杂的...
总之,这个压缩包提供的OGNL-2源代码是一份宝贵的教育资源,对于Java web开发人员,特别是那些专注于Struts2框架的开发者来说,是提高技能和解决实际问题的宝贵资源。通过阅读和分析这些源代码,我们可以深入理解...
同时,需要注意的是,这两个漏洞的修补需要对 Struts2 的配置文件进行修改,因此需要对 Struts2 的配置文件有充分的了解和掌握。 Struts2 的 S2-016 和 S2-017 漏洞的修补需要对 Struts2 的源代码和配置文件进行...
开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12...
camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...
struts.xml文件中新增以下内容: <!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> ...ognl-2.6.11.jar直接覆盖掉原有文件。 使用工具进行测试漏洞是否依然存在。 2013年7月25日
JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11...ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.6.11JavaEE源代码 ognl-2.
ognl-3.0.5源码 本人最近在研究s2sh源码,如有需要请留言。 在使用过程中如果有问题可联系,让我们开始学习s2sh源码总动员吧!
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
赠送jar包:ognl-3.1.12.jar; 赠送原API文档:ognl-3.1.12-javadoc.jar; 赠送源代码:ognl-3.1.12-sources.jar; 赠送Maven依赖信息文件:ognl-3.1.12.pom; 包含翻译后的API文档:ognl-3.1.12-javadoc-API文档-...
`ognl-3.0.6-sources.jar` 包含了OGNL的源代码,这是一门强大的表达式语言,用于在Struts2中访问和操作对象图。OGNL可以用来在视图层动态地获取或设置模型对象的属性,也可以在控制器层执行复杂的表达式来控制流程。...
Struts2_OGNL Demo 是一个用于演示Struts2框架中OGNL(Object-Graph Navigation Language)表达式语言的实例。这个项目旨在帮助开发者理解和学习如何在Struts2中使用OGNL来操纵对象和数据。OGNL是Struts2中一个重要的...
**描述:“struts2中ognl-2.6.11.jar源码文件”** **标签:“ognl”,“ognl-2.6.11”** 在Java Web开发领域,`ognl-2.6.11.jar`是一个关键的组件,它属于OGNL(Object-Graph Navigation Language)库的版本2.6.11...
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于数据绑定和表示层的数据操作。这篇深入学习的文章主要探讨了OGNL表达式的原理和使用。 首先,我们来理解一下OGNL是什么。OGNL是...
- XWork的`OgnlValueStack`是表达式语言OGNL(Object-Graph Navigation Language)在Struts2中的实现,用于在Action和视图之间传递数据。 - 类型转换是XWork的一个重要特性,它可以自动将请求参数转换为Action字段...
`ognl-3.2.jar`是Object-Graph Navigation Language的最新版本,它是Struts2中用于动态数据绑定和表达式语言的关键组件。在S2-045修复中,OGNL的表达式解析和执行机制得到了加强,增强了安全性,避免了恶意代码的...
Struts2 OGNL---标签详解析 都有实例 适合初学者
**ognl-2.6.11.jar 官方源码详解** OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于许多Java框架,如Struts2,因为它允许动态地访问和操作对象的...
OGNL(Object-Graph Navigation Language)是Struts2框架中的一个重要组件,用于在Web应用中访问和操作Java对象的属性,调用其方法,以及执行类型转换等操作。 OGNL是对象图导航语言的缩写,它是一种功能强大的...