`
SIHAIloveYAN
  • 浏览: 119947 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

struts2教程(9)--OGNL表达式使用

 
阅读更多

OGNL表示式使用和值栈

一、介绍

OGNLObject Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。

xwork 提供 OGNL表达式

ognl-3.0.5.jar

OGNL 是一种比EL 强大很多倍的语言

OGNL 提供五大类功能

1、支持对象方法调用,如xxx.doSomeSpecial()

2、支持类静态的方法调用和值访问

3、访问OGNL上下文(OGNL context)和ActionContext; (重点 操作ValueStack值栈 )

4、支持赋值操作和表达式串联

5、操作集合对象。

、 使用OGNL访问 对象方法 和 静态方法

OGNL jsp 结合 struts2 标签库 使用 , <s:property value="ognl表达式" /> 执行 ognl表达式

调用 实例方法 对象.方法() ---- <s:property value="'hello,world'.length()"/>

调用 静态方法 @[类全名(包括包路径)]@[方法名] --- <s:property value="@java.lang.String@format('您好,%s','小明')"/>

使用 静态方法调用 必须 设置 struts.ognl.allowStaticMethodAccess=true

、 访问OGNL上下文(OGNL context)和ActionContext

OGNL上下文(OGNL context) 对象 ----- 值栈 ValueStack

问题一 什么是值栈 ValueStack ?

ValueStack struts2 提供一个接口,实现类 OgnlValueStack ---- 值栈对象 (OGNL是从值栈中获取数据的 )

每个Action实例都有一个ValueStack对象 (一个请求 对应 一个ValueStack对象 )

在其中保存当前Action 对象和其他相关对象 (值栈中 是有Action 引用的 )

Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中 (值栈对象 是 request一个属性)

问题二 值栈的内部结构

值栈由两部分组成

ObjectStack: Struts 把动作和相关对象压入 ObjectStack --List

ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap

Struts 会把下面这些映射压入 ContextMap

parameters: Map 中包含当前请求的请求参数

request: Map 中包含当前 request 对象中的所有属性

session: Map 中包含当前 session 对象中的所有属性

application:Map 中包含当前 application 对象中的所有属性

attr: Map 按如下顺序来检索某个属性: request, session, application

ValueStack中 存在root属性 (CompoundRoot) context 属性 (OgnlContext

CompoundRoot 就是ArrayList

OgnlContext 就是 Map

context 对应Map 引入 root对象

context中还存在 requestsessionapplicationattrparameters 对象引用

OGNL表达式,访问root中数据时 不需要 #, 访问 requestsessionapplicationattrparameters 对象数据 必须写 #

操作值栈 默认指 操作 root 元素

问题三 值栈对象的创建 ValueStack ActionContext 是什么关系 ?

值栈对象 是请求时 创建的

doFilterprepare.createActionContext(request, response);

创建ActionContext 对象过程中,创建 值栈对象ValueStack

ActionContext对象 对 ValueStack对象 有引用的 (在程序中 通过 ActionContext 获得 值栈对象 )

DispatcherserviceAction 方法中 将值栈对象保存到 request范围

request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());

问题四 如何获得值栈对象

获得值栈对象 有两种方法

ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

ValueStack valueStack2 = ActionContext.getContext().getValueStack();

问题五: 向值栈保存数据 (主要针对 root

两种方式

// 将数据保存root的索引0位置,放置到第一个元素 ArrayList add(0,element);

valueStack.push("itcast");

// 在值栈创建参数map, 将数据保存到map

valueStack.set("company", "传智播客");

jsp中 通过 <s:debug /> 查看值栈的内容

问题六: JSP中获取值栈的数据

访问root中数据 不需要#

访问 其它对象数据 #

通过下标获取root中对象

<s:property value="[0].top"/> //取值栈顶对象

直接在root中查找对象属性 (自上而下自动查找)

valueStack:<s:property value="username"/>

OgnlContext中获取数据

request:<s:property value="#request.username"/>

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

application:<s:property value="#application.username"/>

attr:<s:property value="#attr.username"/>

parameters:<s:property value="#parameters.cid[0]"/>


四、 值栈在开发中应用

主流应用 值栈 解决 Action JSP 传递 数据问题

Action JSP 传递数据处理结果 ,结果数据有两种形式

1) 消息 String类型数据

this.addFieldError("msg", "字段错误信息");

this.addActionError("Action全局错误信息");

this.addActionMessage("Action的消息信息");

fieldError 针对某一个字段错误信息 (常用于表单校验)、actionError (普通错误信息,不针对某一个字段 登陆失败)actionMessage 通用消息

jsp中使用 struts2提供标签 显示消息信息

<s:fielderror fieldName="msg"/>

<s:actionerror/>

<s:actionmessage/>

2) 数据 (复杂类型数据)

使用值栈 valueStack.push(products);

哪些数据默认会放入到值栈

1)每次请求,访问Action对象 会被压入值栈 ------- DefaultActionInvocation init方法 stack.push(action);

Action如果想传递数据给 JSP,只有将数据保存到成员变量,并且提供get方法就可以了

2ModelDriven 接口 有一个单独拦截器

<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

在拦截器中 ,将model对象 压入了 值栈 stack.push(model);

如果Action 实现ModelDriven接口,值栈默认栈顶对象 就是model对象

五、 值栈的数据 通过EL访问

问题七:为什么 EL也能访问值栈中的数据

StrutsPreparedAndExecuteFilterdoFilter代码中 request = prepare.wrapRequest(request);

Request对象进行了包装 ,StrutsRequestWrapper

重写requestgetAttribute

Object attribute = super.getAttribute(s);

if (attribute == null) {

attribute = stack.findValue(s);

}

访问request范围的数据时,如果数据找不到,去值栈中找

lrequest对象 具备访问值栈数据的能力 (查找root的数据)

OGNL表达式 常见使用

#% $ 符号使用

1# 的 使用

用法一 # 代表 ActionContext.getContext() 上下文

<s:property value="#request.name" /> ------------> ActionContext().getContext().getRequest().get("name");

#request

#session

#application

#attr

#parameters

用法二 不写# 默认在 值栈中root中进行查找

<s:property value="name" /> root中查找name属性

查询元素时,从root的栈顶元素 开始查找, 如果访问指定栈中元素 <s:property value="[1].name" /> 访问栈中第二个元素name属性

访问第二个元素对象 <s:property value="[1].top" />

用法三 :进行投影映射 (结合复杂对象遍历

1)集合的投影(只输出部分属性

<h1>遍历集合只要name属性</h1>

  <s:iterator value="products.{name}" var="pname">

                     <s:property value="#pname"/>

            </s:iterator>


2)遍历时,对数据设置条件

<h1>遍历集合只要price大于1500商品</h1>

	<s:iterator value="products.{?#this.price>1500}" var="product">

                 <s:property value="#product.name"/> --- <s:property value="#product.price"/>

           </s:iterator>


3)综合

<h1>只显示价格大于1500 商品名称</h1>

	<s:iterator value="products.{?#this.price>1500}.{name}" var="pname">
	<s:iterator value="#{'name':'aaa','age':'20', 'hobby':'sport' }" var="entry">

key : <s:property value="#entry.key"/> , value:  <s:property value="#entry.value"/> <br/>

</s:iterator>

<s:property value="#pname"/></s:iterator>



用法四: 使用#构造map集合

经常结合 struts2 标签用来生成 selectcheckboxradio

<h1>使用#构造map集合 遍历</h1>

	<s:iterator value="#{'name':'aaa','age':'20', 'hobby':'sport' }" var="entry">

key : <s:property value="#entry.key"/> , value:  <s:property value="#entry.value"/> <br/>

</s:iterator>


2) %的使用

用法一:结合struts2 表单表单使用, 通过%通知struts%{}中内容是一个OGNL表达式,进行解析

<s:textfield name="username" value="%{#request.username}"/>

用法二:设置ognl表达式不解析 %{'ognl表达式'}

<s:property value="%{'#request.username'}"/>

3$的使用

用法一 :用于在国际化资源文件中,引用OGNL表达式

properties文件 msg=欢迎您, ${#request.username}


用法二:在Struts 2配置文件中,引用OGNL表达式

<!-- Action 提供 getContentType方法 -->

<param name="contentType">${contentType}</param>

${contentType} 读取值栈中contentType数据,在Action提供 getContentType 因为Action对象会被压入值栈,

contentTypeAction属性,从值栈获得

结论: #使用ognl表达式获取数据,% 控制ognl表达式是否解析 ,$ 用于配置文件获取值栈的数据



分享到:
评论

相关推荐

    Struts2深入学习----OGNL表达式原理

    Struts2是一个流行的Java Web...通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在Struts2开发中更进一步的人来说,熟悉和掌握OGNL是必不可少的技能。

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    Struts2 使用OGNL表达式

    以下是一些关于Struts2中OGNL表达式的关键知识点: 1. **基础语法**:OGNL表达式的格式通常为`object.property`或`object[index]`,用于访问对象的属性或数组/集合的元素。例如,`user.name`将获取名为`user`的对象...

    Struts2 如何使用OGNL表达式(三十八)

    因此,开发者应使用Struts2的安全配置选项,如禁用不安全的OGNL表达式,或者使用`@SkipValidation`注解来限制某些Action方法的OGNL表达式执行。 总结来说,Struts2中的OGNL表达式是连接模型和视图的关键工具,它...

    Struts2的标签库及OGNL表达式语言

    本篇文章将详细探讨Struts2中的OGNL表达式语言以及标签库。 **OGNL(对象图导航语言)** OGNL是一种强大的表达式语言,它允许开发者通过简洁的语法来访问和操作对象的属性。在Struts2框架中,OGNL扮演着至关重要的...

    ognl表达式 ognl表达式

    在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...

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

    同时,源代码分析也能帮助开发者避免潜在的问题,如安全漏洞,例如著名的Struts2 S2-045远程代码执行漏洞,就是由于OGNL表达式不当处理导致的。因此,理解和掌握这些源代码不仅能提高开发效率,也有助于增强应用的...

    struts2-OGNL表达式测试

    这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...

    Struts2表达式语言----OGNL语言指南

    Struts 2默认的表达式语言,

    JS:ognl表达式

    ### JS:ognl表达式详解 #### 一、OGNL表达式概述 OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛...

    ognl表达式java使用案例详解(测试通过)

    Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1、 支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@...

    struts2 OGNL表达式

    在提供的压缩包文件"Struts2_1900_OGNL"中,可能包含了一些关于Struts2 OGNL表达式使用和安全性的示例代码、教程文档或是漏洞分析。通过研究这些内容,你可以更深入地理解和掌握Struts2框架中OGNL表达式的运用,以及...

    OGNL表达式

    OGNL表达式通常结合Struts2的标签一起使用,比如使用 `&lt;s:property value="expression"/&gt;` 来展示数据。在使用过程中,需要注意#、%和$这三个符号的正确使用: - **#**:通常用于表示OGNL表达式,在Struts2中作为...

    Struts2--5.OGNL

    1. Action结果映射:Struts2允许在Action的结果配置中使用OGNL表达式,比如跳转到某个页面并传递参数。 2. 结果值栈:Struts2使用值栈来存储请求相关的数据,OGNL可以从值栈中检索或修改数据。 3. JSP标签:在JSP...

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

    通过Javadoc,开发者可以学习到如何使用OGNL表达式来绑定模型数据到视图,或者在控制器中执行条件判断和循环等操作。OGNL的灵活性和强大功能使得Struts2具有高度的数据绑定能力。 在Eclipse这样的集成开发环境中,...

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

    - 在Struts2的Action类中,可以使用OGNL表达式来动态地处理请求参数,如`String name = (String)params.get("user.name");` - 在JSP页面上,使用OGNL标签显示和处理数据,如`管理员界面&lt;/s:if&gt;`。 通过理解并熟练...

    struts2.3.32修补S2-045漏洞所有核心jar包及依赖的jar(含core包)

    S2-045漏洞是一个严重的远程代码执行(RCE)漏洞,存在于Apache Struts2的OGNL表达式语言中。这个漏洞允许攻击者通过精心构造的HTTP请求在服务器端执行任意代码,对系统安全构成极大威胁。Struts2.3.32的发布就是...

    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表达式注入漏洞分析1

    《STRUTS2类型转换错误导致OGNL表达式注入漏洞分析》 STRUTS2框架在处理用户输入时出现的类型转换错误,可能导致OGNL(Object-Graph Navigation Language)表达式注入漏洞。此漏洞允许攻击者通过精心构造的输入,...

Global site tag (gtag.js) - Google Analytics