`
esperanza
  • 浏览: 183325 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2在OGNL基础上的增强

阅读更多

Ø  值栈(ValueStack)

 Struts2OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。我们知道,OGNL上下文中的根对象可以直接访问,不需要使用任何特殊的标记,而引用上下文中的其他对象则需要使用“#”来标记。由于值栈是OGNL上下文中的根对象,因此可以直接访问。那么对于值栈中的对象该如何访问呢?Struts2提供了一个特殊的OGNLPropertyAccessor,它可以自动查找栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象。也就是说,对于值栈中的任何对象都可以直接访问,而不需要使用“#”。假设值栈中有两个对象:studentemployee,两个对象都有name属性,student有学号属性number,而employee有薪水属性salaryemployee先入栈,student后入栈,位于栈顶,那么对于表达式name,访问的就是studentname属性,因为student对象位于栈顶;表达式salary,访问的就是employeesalary属性。正如你所见,访问值栈中的对象属性或方法,无须指明对象,也不用“#”,就好像值栈中的对象都是OGNL上下文中的根对象一样。这就是Struts2OGNL基础上做出的改进。

Ø  [N]语法

如上所述,如果想要访问employeename属性,应该如何写表达式呢?我们可以使用[N].xxx(N是从0开始的整数)这样的语法来指定从哪一个位置开始向下查找对象的属性,表达式[1].name访问的就是employee对象的name属性。在使用[N].xxx语法时,要注意位置序号的含义,它并不是表示获取栈中索引为N的对象,而是截取从位置N开始的部分栈。

Ø  top关键字

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

Ø  访问静态成员

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

    @vs@FOO_PROPERTY

    @vs@someMethod()

    @vs1@someMethod()

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

Ø  值栈中的Action实例

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

Ø  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,相当于调用了ServletContextgetAttribute()方法。

   Attr

    如果PageContext可用,则访问PageContext,否则依次搜索requestsessionapplication对象。

struts2OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示: 

                        |--request   

                        |--application   

context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]   

                        |--session   

                        |--attr   

                        |--parameters  

    Struts2框架把OGNL Context设置为我们的ActionContext。并且ValueStack作为OGNL的根对象。除value stack之外,Struts2框架还把代表applicationsessionrequest这些对象的Map对象也放到ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能,以方便对Action类进行测试!) 

    Action的实例,总是放到value stack中。因为Action放在stack中,而stackroot(根对象),所以对Action中的属性的访问就可以省略#标记。但是,要访问ActionContext中其它对象的属性,就必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其它对象中去寻找。 

    那么访问Action中的属性的代码就可以这样写 

<s:property value="postalCode"/> 

    其它ActionContext中的非根对象属性的访问要像下面这样写: 

<s:property value="#session.mySessionPropKey"/> or 

<s:property value="#session['mySessionPropKey']"/> or 

<s:property value="#request['myRequestPropKey']"/> 

    Collection的处理,内容就很简单。 

<s:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" /> 

    这是处理List。这个代码在页面上建立一个下拉选项,内容是list中的内容,默认值是name2. 

处理map 

<s:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}" /> 

     需要注意的是,判断一个值是否在collection中。我们要使用in或者not in来处理。 

<s:if test="'foo' in {'foo','bar'}"> 

   muhahaha 

</s:if> 

<s:else> 

   boo 

</s:else> 

另外,可以使用通配符来选择collection对象的子集。 

?——所有匹配选择逻辑的元素 

^——只提取符合选择逻辑的第一个元素 

$——只提取符合选择逻辑的最后一个元素 

person.relatives.{? #this.gender == 'male'} 

分享到:
评论

相关推荐

    struts2.16+ognl2.61+xwork2.1源码.rar

    在Struts2中,OGNL被用作默认的表达式语言,负责处理Action属性到JSP页面之间的数据绑定以及用户输入的解析和设置。OGNL2.61是这个库的一个版本,可能会包含新的功能、性能改进和错误修复。 3. **XWork**: XWork是...

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

    `ognl-3.0.6-sources.jar` 包含了OGNL的源代码,这是一门强大的表达式语言,用于在Struts2中访问和操作对象图。OGNL可以用来在视图层动态地获取或设置模型对象的属性,也可以在控制器层执行复杂的表达式来控制流程。...

    对 Struts2 OGNL 的分析与简介

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

    struts2 ognl

    1. OGNL基础:解释OGNL的基本语法,如访问对象属性、调用方法、数组和集合操作、条件语句以及运算符的使用。 2. Struts2 Action和Value Stack:如何创建Action类,Action类如何与Value Stack交互,以及Value Stack...

    struts2详细讲解,JQuery,类型转换和OGNL

    在Struts2应用中,JQuery可以用于增强用户体验,例如实现动态加载数据、表单验证和异步提交等。结合Struts2的Ajax插件,我们可以轻松创建无刷新的交互式应用。 接下来,我们讨论一下类型转换。在Struts2中,类型...

    最新 ognl-2.6.11+struts2-core-2[1].0.11+xwork-2.0.5源码

    在Struts2中,OGNL作为默认的表示层语言,用于在视图和模型之间传递数据。它的功能包括对象导航、方法调用、表达式计算等,使得开发者可以方便地访问和操作对象的属性,如`#{user.name}`。OGNL-2.6.11版本提供了改进...

    struts2基础jar包

    6. **OGNL(Object-Graph Navigation Language)**:Struts2默认使用OGNL作为表达式语言,它允许在Action和视图之间便捷地传递数据。OGNL可以用来访问对象属性、执行方法、进行运算等。 7. **插件体系**:Struts2...

    struts2的基础知识

    Struts2提供了一套完善的MVC架构,通过Action、拦截器、Result和OGNL等机制,简化了Java Web应用的开发过程,增强了代码的可维护性和可扩展性。熟练掌握Struts2的基本知识和使用技巧,对于提升Web开发效率和项目质量...

    struts2框架基础jar包

    3. **依赖库**:Struts2框架还依赖于其他开源库,如OGNL(Object-Graph Navigation Language)表达式语言库`ognl.jar`,用于在Action和视图之间传递数据;Freemarker或Velocity等模板引擎库,如`freemarker.jar`,...

    struts2必备基础jar包

    Struts2是一个强大的Java web应用程序开发...综上所述,"struts2必备基础jar包"包含了Struts2框架运行所必需的库,通过这些库,开发者可以轻松构建基于Struts2的应用程序,实现高效的业务逻辑处理和优雅的视图展示。

    Struts2综合演示实例

    在这个综合演示实例中,我们将深入探讨如何使用Struts2框架,结合SQL、JDBC、Java、JSP、JavaScript以及Struts2标签库和OGNL表达式来创建一个完整的应用。 首先,让我们了解Struts2的核心概念。Struts2框架提供了一...

    struts2 项目源码

    本项目源码提供了一个基础的Struts2应用程序实例,对于初学者来说,这是一个很好的学习资源,可以深入理解Struts2的工作原理和架构。 Struts2的核心组件包括: 1. **Action类**:Action类是业务逻辑的载体,它是...

    struts2所有jar包程序文件

    3. `ognl.jar`:Object-Graph Navigation Language (OGNL)是Struts2中使用的表达式语言,用于在视图层和模型层之间传递数据。 4. `freemarker.jar`和`velocity.jar`:这两种是模板引擎,用于生成动态HTML页面。...

    struts2全部的jar包

    OGNL是Struts2中的默认表达式语言,用于在Action与视图之间传递数据。它允许在Action、JSP、甚至配置文件中灵活地访问和修改对象属性。 7. **Struts2的JAR包**: - `struts2-core.jar`:包含框架的核心组件,如...

    struts与struts2的区别

    而Struts2则是在Struts1的基础上进行了全面改进,采用了拦截器(Interceptor)机制,使得处理请求的方式更加灵活和模块化。 **2. 拦截器:** Struts2的核心就是拦截器,它们是基于责任链模式实现的,可以进行一系列...

    struts2 基本jar包

    3. **ognl.jar**:Object-Graph Navigation Language (OGNL) 是Struts2中的表达式语言,用于在模型、视图和控制器之间传递数据。它是Struts2中动作方法调用和属性访问的基础。 4. **freemarker.jar**:FreeMarker是...

    struts2 ,struts2 demo

    OGNL是Struts2中的默认表达式语言,用于在Action和视图之间传递数据。例如,`${user.name}`可以获取User对象的name属性。 **7. Struts2的注解** 除了XML配置外,Struts2还支持使用注解进行配置,使得代码更加简洁。...

    Struts2实战(Struts2 In Action中文版)

    1. **Struts2基础**:介绍Struts2的基本概念,包括配置文件、Action类、结果类型和视图解析。 2. **OGNL表达式语言**:Struts2使用OGNL(Object-Graph Navigation Language)进行数据绑定和表达式操作,学习如何...

    当当网 Struts2

    Struts2是Java Web开发中一个非常重要的框架,它基于MVC(Model-View-Controller)设计模式,为开发者...在当当网这样的大型电商平台上,熟练掌握Struts2这样的技术对于解决复杂业务问题、提高开发效率是非常有益的。

Global site tag (gtag.js) - Google Analytics