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. OPENSSL库的使用-DES篇

    一.单DES算法ECB模式加解密 1.使用函数DES_set_key_unchecked设置密钥 2.使用函数DES_ecb_encrypt来进行数据加解密 void DES_ecb_encrypt( ...

  2. Ubuntu 安装启动Tomcat

    首先下载ubuntu 的tar包 官网: http://tomcat.apache.org/download-80.cgi 安装启动 1 .下载对应的tar 2 .解压任意文件夹下,更改名字tomca ...

  3. 面试中关于Java中涉及到知识点(转)

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  4. CCIE路由实验(10) -- IS-IS

    1.配置基本的集成IS-IS路由协议2.多区域的集成IS-IS配置3.IS-IS认证4.IS-IS路由泄露5.IS-IS汇总6.在IS-IS中手动产生一条默认路由7.IS-IS协议重分布8.用IS-I ...

  5. javascript iframe 视频解码

    function confirmVdo(){ var videoVal = $(".video_src").val(); if(videoVal){ videoVal = vide ...

  6. xss 跨站脚本攻击

    这是一个非常简单的攻击. 两个页面如下: <form action="MyJsp.jsp" method="get"> <input type ...

  7. HTML学习笔记(七)

    1.       假设想让div中的内容(content)垂直居中,能够将line-height的值设置与div的高度相等来实现. 2.       超伪类链接的四种形式: watermark/2/t ...

  8. sql: update from

    sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式 中引 ...

  9. perl eval

    eval 表达式: eval 块: eval 在第一种形式,通常称为一个字符串eval EXPR 返回值是被解析的和被执行的作为一个小小的Perl程序. 表达式的值(是它本身决定的在标量上下文环境)是 ...

  10. 基于visual Studio2013解决面试题之0707最小元素

     题目