在编程中,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是一个流行的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)...通过阅读和分析这些源代码,我们可以深入理解OGNL如何在Struts2中发挥作用,以及如何优化和保护我们的应用免受潜在的安全威胁。
在 Struts2 框架中,OGNL 作为默认的表示层语言,用于视图与模型之间的数据绑定。Struts2 的核心功能之一就是允许开发者通过 OGNL 表达式在 JSP 页面、Action 类以及值栈之间灵活地传递数据。 源码分析: 1. **...
#### 二、Struts2 的核心组件分析 **控制器**: - **Servlet VS Filter**: - **Servlet**: - 在内存中唯一实例。 - 可以设置 `load-on-startup` 属性使其在服务器启动时初始化。 - 用户每次请求都会调用 `void ...
8. **ognl-2.6.11.jar**:OGNL(Object-Graph Navigation Language)是Struts2的表达式语言,用于在视图和模型之间绑定数据、执行方法等操作。它使模板中的动态内容变得更加简单。 9. **junit.jar**:JUnit是一个...
在Struts 2中,OGNL被用来传递和解析Action方法的参数以及视图层的数据绑定。 7. **Apache Commons IO** (`commons-io-2.0.1.jar`): 提供了各种IO操作的工具类,如文件读写、流处理等,简化了处理输入输出流的复杂...
5. `javassist-3.11.0.GA.jar`: Javassist是一个Java字节码操作和分析库,Struts 2使用它来实现运行时的类增强,例如动态代理和拦截器的生成。 6. `commons-lang3-3.2.jar`: Apache Commons Lang是一个包含很多实用...
5. **UI组件**:在前端,我们可能会看到使用ExtJS创建的各种组件,如数据网格显示从Struts2返回的数据,表单用于用户输入,以及可能的图表展示分析结果。 6. **数据绑定**:通过OGNL,Struts2可以将服务器端的数据...
10. **asm-3.3.jar**:ASM是一个字节码操纵和分析框架,Struts2可能使用它来进行类的动态生成或修改,尤其在类增强和AOP(面向切面编程)方面。 这些jar包的完整集合确保了Struts2框架的正常运行,并提供了开发高效...
Struts2还支持OGNL(Object-Graph Navigation Language)作为表达式语言,使得视图和模型之间的数据绑定更加灵活。 **Spring框架详解:** Spring是一个轻量级的框架,它的核心特性是依赖注入(DI),允许开发者在...
- **书籍概述**:《Struts2 In Action》是一本深入介绍Struts2框架的著作,由Donald Brown、Chad Michael Davis和Scott Stanlick共同编写。本书通过详实的案例分析与实践指导,帮助读者全面掌握Struts2这一现代Web...
5. **ognl-3.0.jar**:OGNL(Object-Graph Navigation Language)是Struts2中的表达式语言,用于在应用程序中获取和设置对象的属性,以及执行简单的逻辑和控制流。它使得开发者可以方便地在Action、JSP和标签中进行...
现在,我们逐一分析这些jar包的作用和它们在Struts2框架中的角色: 1. `struts2-core-2.0.11.1.jar`:这是Struts2的核心库,包含了框架的主要组件,如Action、Result、Interceptor等。它提供了一整套机制来处理HTTP...
Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们共同构成了企业级应用的基础架构,被广泛用于构建高效、可维护性高的Web应用程序。本资料主要关注这三者结合的实际应用和项目实战,通过源码分析和...
作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...
Struts2是一个流行的Java web开发框架,它...这些文件共同展示了如何在Struts2框架下构建一个能够生成和处理JSON响应的应用。通过分析和理解这个示例,开发者可以学习到如何有效地在Struts2应用中集成和使用JSON功能。
7. **ognl-3.0.6.jar**:Object-Graph Navigation Language(OGNL)是Struts2中的表达式语言,用于获取和设置对象属性,以及执行方法。它使得在Action、值栈和视图之间传递数据变得更加简单和灵活。 8. **commons-...
6. **Ognl**:Struts2使用OGNL(Object-Graph Navigation Language)作为表达式语言,用于在Action和视图之间传递数据。查看其源码可以帮助理解数据绑定和表达式解析的原理。 7. **Plugins**:Struts2的插件系统...
Struts、Struts2、Hibernate和Spring是Java开发中非常重要的四大框架,它们各自负责不同的领域,共同构建了企业级应用的基础架构。Struts作为MVC(Model-View-Controller)设计模式的实现,主要用于控制应用程序的...