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. jQuery格式化时间插件formatDate

    一.不传时间 $.formatDate("yyyy-MM-dd HH:mm:ss");   二.传时间 $.formatDate("yyyy-MM-dd HH:mm:ss ...

  2. docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)

    本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...

  3. 服务列表 - Sina App Engine

    服务列表 - Sina App Engine 短信服务 新浪无线短信服务是由新浪无线提供的综合性短信服务. 使用服务 下载SDK: php 服务首页 方法 新浪无线短信服务是由新浪无线提供的综合性短信 ...

  4. BNU Questions and answers

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=2490 这个题是先输入一个整数n,说明有几个数据,然后输入n个整数,然后用三个#分开,后面输入整数k, ...

  5. MySql连接问题

    今天想通过命令连接到另外一台主机的Mysql 命令: mysql -h ip -u username -p EnterPassWord: password 连接成功

  6. WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)

    原文:WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话 ...

  7. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

  8. android设置eclipse中的自动提示功能

    菜单window->Preferences->Java->Editor->Content Assist->Enable auto activation 选项要打上勾 (并 ...

  9. 基于visual Studio2013解决C语言竞赛题之1021九九乘法表

         题目 解决代码及点评 /* 功能:请编程序按如下格式打印一个直角三角形的九九乘法表: 1 2 3 4 5 6 7 8 9 4 6 8 10 12 14 16 18 9 1 ...

  10. linux ftp批量上传和下载文件

    一.登录ftp 输入 ftp 192.168.1.111 输入用户名:ftpuser 输入密码:aaa123 二.转到目标目录 输入:cd   test   ----test为文件夹 三.批量上传 输 ...