OGNL:Object-Graph Navigation Language.对象图形化导航语言

OGNL是集成进struts2框架中比較强大的技术有助于传输数据和类型转换,OGNL由表达式语言和类型装换器组成。

表达式语言:

我们已经在jsp表单input名和jsp标签使用该语言了.他用来绑定java端的数据属性和基于字符串的

视图层表示.表达式语言甚至能够进行方法调用,目的就在于方便数据訪问.大多数时候OGNL表达式不

须要转义,如需转义的话,须要用到%{表达式}符号.框架会把它依照表达式来处理而不是解释成字符

串语义.

以下是ognl的类图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU0ODM3Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

说明:

1.ValueStack是一个接口,在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类OgnlValueStack,这个类是OgnlValueStack的基础。

2.ValueStack贯穿整个action的生命周期。每个action实例都拥有一个ValueStack对象。当中保存了当前action对象和其它相关对象。(内部底层事实上是用ThreadLocal实现Action范围内数据共享)

3.Struts2把ValueStack对象保存中名为struts.valueStack的request域中。

以下是ValueStack的图解:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU0ODM3Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

说明:

1,上图是ognl完整的数据结构图。能够清晰得看出数据的组成。

2,Context中的_root和ValueStack中的root(对象栈)里的数据结构和值是一样的。

3,这就意味着我们仅仅须要操作OgnlContext就能够完毕对数据的存和取的操作。

4,ValueStack内部有两个逻辑的组成部分:

        a,ObjectStac

Struts会把动作和相关的对象压入到ObjectStack中。

b,ContextMap

Struts会把一些映射关系压入到ContextMap中

向map中存数据

1, ServletActionContext.getRequest().setAttribute("req_username","req_username");

ServletActionContext.getRequest().setAttribute("req_psw", "req_psw");

ActionContext.getContext().getSession().put("session_username", "session_username");

ActionContext.getContext().getSession().put("session_psw", "session_psw");

2,ActionContext.getContext().put("data", "aaaaaaaaaaaaaaaaa");

向值栈中存数据

1,

/*

 * 把对象放入到值栈中

 */

//方法一:先得到root,把一个对象压入到root中

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

valueStack.getRoot().add(new Person());

valueStack.getRoot().add(new Student());

2,

/*

 * 方法二:先得到root。利用add(index,Object)把一个对象压入到root中

 * 这里index指的是集合中的位置

 */

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

valueStack.getRoot().add(new Person());

valueStack.getRoot().add(0, new Student());

3,

/*

 * 方法三:

 *   把一个键值对存放在对象栈中

 */



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

valueStack.set("msg","msg_object");

4,

/*

 * 方法4

 * 利用ValueStack的push方法能够把一个对象直接压入对象栈的第一个位置

 */

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

valueStack.push(new Person());

OGNL Context图解:

1,上图为OGNL Context的结构图

2,当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action压入到值栈中。

所以action的实例变量能够被ognl訪问。所以利用ognl表达式能够訪问action。

3,ActionContext是Action运行时的上下文。上下文能够看作是一个map容器(事实上我们这里的容器就是一个Map而已),存放Action在运行时须要用到的对象。而ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了ActionContext,它提供了直接与JavaServlet相关对象訪问的功能。例如以下代码:

Map session = ActionContext.getContext().getSession()。

HttpSession session = ServletActionContext. getRequest().getSession();

4,每次请求都会创建一个Action,运行Action之前都会创建新的ActionContext。ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的。这样Action就能够在多线程中使用。

OGNL表达式:

1,訪问OGNL上下文和action上下文,#相当于ActionContext.getContext();

2,假设訪问的是map中的值而不是对象栈中的值,因为map中的数据不是根对象,所以在訪问时须要加入#前缀。

Demo:

在Action中:

public String testScope() {

// 把字符串"request_msg"放入到request域中

ServletActionContext.getRequest().setAttribute("request_username","request_username");

// 把字符串"session_msg"放入到session域中

ServletActionContext.getRequest().getSession().setAttribute("session_username", "session_username");

// 把字符串"application_msg"放入到application域中

ServletActionContext.getServletContext().setAttribute("application_username", "application_username");

return "ognl_scope";

}

页面中:

ognl表达式关于scope(request,session,application)的输出<br>

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

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

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

3,OGNL会设定一个对象(root对象)。在struts2中根对象就是CompoundRoot。或者为OgnlValueStack中的root,通常被叫做ValueStack(值栈或者对象栈)。假设要訪问根对象的属性,则能够省略去#,直接訪问对象的属性就可以。

Demo:

在Action中:

public String testObjectValue(){

//得到ognl的上下文 

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

valueStack.set("msg", "object_msg");

return "ognl_objectstack";

}

在页面中:

对象栈的内容:<s:property value="msg"/>

//把对象栈中key值为msg的value的值输出

对struts2的OGNL的理解的更多相关文章

  1. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  2. Struts2之OGNL

    一.OGNL是什么? OGNL(Object-Graph Navigation Language)对象图导航语言,是一种表达式语言,它可以 1.遍历对象的结构图 2.存取对象的属性(实例属性和静态属性 ...

  3. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  4. struts2之OGNL和struts2标签库和ValueStack对象

    OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.  struts2框架默认就支持Ognl表达式语言(所以 ...

  5. Struts2对Ognl的支持

                                                      Struts2对Ognl的支持 一. 写作背景 由于工作性质的变化,最近一直在研究struts2,从 ...

  6. 2018.11.25 struts2与OGNL表达式的结合(高级)

    两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...

  7. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  8. JavaWeb_(Struts2框架)Ognl小案例查询帖子

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  9. Struts2与OGNL的联系

    1.Struts与OGNL的结合原理 (1)值栈: OGNL表达式要想运行就要准备一个OGNLContext对象,Struts2内部含有一个OGNLContext对象,名字叫做值栈. 值栈也由两部分组 ...

随机推荐

  1. 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...

  2. JRE 和 JDK 的区别是什么?

    JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java ...

  3. C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客

    C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客 C++中实现对map按照value值进行排序 2012-03-15 15:32:36 标签:map 职场 休闲 排 ...

  4. TCP连接状态具体解释

    tcp状态: LISTEN:侦听来自远方的TCPport的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ...

  5. mysql导入sql文件过大或连接超时的解决的方法

    前段时间出差在现场开发的时候,导入数据库老是出问题.最后发现了一个奇妙sql语句交给实施,仅仅要导入出错就把例如以下语句运行就能够了.至今屡试不爽. set global max_allowed_pa ...

  6. c语言,结构体里面的函数

    以linux-3.2内核代码为例,结构体里面的函数的用法: 例,在某驱动文件中,定义了一个平台设备驱动: static struct platform_driver s3c24xx_led_drive ...

  7. 一则 ORA-00471 处理方法

    公司新上架一台服务到机房,硬件是IBM X3850 X5,硬件配置算是好的,内存有128GB.SA安装好系统--(版本sule 32bit)后通知我可以安装数据库了.忙活半天,安装好oracle 92 ...

  8. 64位win7旗舰版搭建apache+php+mysql开发环境[转]

      我建议把apache.php.mysql都安装在一个文件夹中,比如:web/apache.web/php.web/mysql 1.安装apache2.2.25,请查看win7下安装VC9版本的ap ...

  9. 国内使用Google Maps JavaScript API

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="ini ...

  10. OSI七层模型基础知识及各层常见应用

       OSI Open Source Initiative(简称OSI,有译作开放源代码促进会.开放原始码组织)是一个旨在推动开源软件发展的非盈利组织.OSI参考模型(OSI/RM)的全称是开放系统互 ...