一、OGNL(Object-Groph Navigation Language)

    是一种强大的表达式语言,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

  1)与EL表达式对比:

        OGNL对象图导航语言,比EL表达语言更强大:EL只能从域中获取数据,OGNL可以存取数据,可以调用对象的方法,获取struts的值栈的数据。

        是第三方的表达式语言(但struts中自带OGNLjar包)

  2)OGNL功能:

      1.支持运算符(+-*/)

      2.支持对象的方法调用,如xxx.doSomeSpecial();

      3.支持类静态的方法调用和值访问。

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

      5.访问OGNL上下文。

      6.操作集合对象。

      7.可以直接new一个对象。

  3)OGNL使用要素:

      1.表达式(取)

      2.根对象(存)

      3.Context对象(非根对象)(存)

  4)OGNL入门

      1.OGNL核心类:OgnlContext,本质是一个map

        1.1往根里存取数据(重要)存入的是Root去

          可以取出存的对象的字段的值

    @Test
public void test(){
//ognl使用
OgnlContext ognlContext = new OgnlContext();
//存数据 根对象
ognlContext.setRoot("aa");
//取数据
Object ognlroot = Ognl.getRoot(ognlContext);
System.out.println(ognlroot);
}

      

  @Test
public void test2() throws OgnlException {
OgnlContext ognlContext = new OgnlContext();
//存数据 根对象
goods goods = new goods();
goods.setName("ual");
goods.setPrice(123.0);
ognlContext.setRoot(goods);
//取数据 直接取值:用Ognl.getValue(),有三个参数:1.取哪一个字段,2.ognlContext 3.root
//获取root
Object root = ognlContext.getRoot();
Object name = Ognl.getValue("name", ognlContext, root);
System.out.println(name);
}

      1.2往非根对象中存取数据(重要)存入的是map Value区

    不可以取出存的对象的字段的值,只能取出存入的对象。

 @Test
public void test3() throws OgnlException {
OgnlContext ognlContext = new OgnlContext();
//存数据,非根对象
goods goods= new goods();
goods.setName("ual");
goods.setPrice(11.1);
ognlContext.put("goods",goods);//相当于往map中存
//非根对象无法直接取出字段,取的就是存的内容
//获取root
Object root = ognlContext.getRoot();
//用Ognl.getValue(),有三个参数:1.#key,2.ognlContext 3.root
goods obj = (goods)Ognl.getValue("#goods", ognlContext, root);//key值前要加#
System.out.println(obj.getName());
System.out.println(obj.getPrice()); }

    1.3调用对象的方法

    调用静态方法要写完整名,且前面后后面加@

   @Test
public void test4() throws OgnlException {
OgnlContext ognlContext = new OgnlContext();
Object root = ognlContext.getRoot();
//调用对象的普通方法
Object value = Ognl.getValue("'hello'.length()", ognlContext, root);
System.out.println(value);
//调用静态方法
Object value1 = Ognl.getValue("@java.lang.Math@random()", ognlContext, root);
System.out.println(value1);
}

二、值栈

    1.)什么是值栈

       ValueStack实际上就是一个容器,是一个接口,实现类是OgnlValueStack,当用户每次访问action对象的业务方法时,首先会创建ActionContext对象,OgnlValueStack对象(所有的数据放入其中),Action对象。OgnlValueStack对象由struts框架创建,当前端页面,如jsp发送请求时,struts默认的拦截器会将请求中的数据进行封装,并入ValueStack栈顶,struts框架中的数据就不存到域中了,而是保存到了ValueStack中。ValueStack贯穿整个action的生命周期,action一旦创建,就会创建一个ValueStack对象。

      存到域中的数据只能在页面中把它取出来,存入值栈中的数据可以在任意地方取出(如页面中,action中,配置文件中),存入域中的数据也可以从值栈中获取出来。

    2.)  值栈内部结构

        分为根区与非根区

        根区:存放当前action中的数据,此次请求的数据。

        非根区:整个程序相关的数据,相关域,res,session,application.

      获取值栈:

public String execute(){
//获取值栈
//根区,非根区
//根区存放当前action相关的数据
//非根区:整个程序相关的数据,相关域 res session application
ValueStack valueStack = ActionContext.getContext().getValueStack();//获取值栈
//往域中写入一些信息
ActionContext context = ActionContext.getContext();
context.put("reqName","reqValue");
context.getSession().put("SessionName","SessionValue");
context.getApplication().put("ApplicationName","ApplicationValue"); System.out.println(goods);
return null;
}

      出入值栈:

  

   Goods goods1= new Goods();
goods1.setName("xx");
goods1.setPrice(32.2);
valueStack.push(goods1);//入栈
valueStack.pop();//出栈

    3.)页面中获取数据

      由于request域中已经存入了值栈,所以页面中可以获取值栈。

       1.在页面获取调试信息

          1.1在struts.xml中加入:

           1.2在jsp页面引入标签库,与调试标签

 

      2.元素获取     :value中的值就是写入OGNL表达式。

        2.1存入根区的数据可以直接获取属性值

            获取根元素时,获取的是栈顶元素。

<s:property value="name"/><%--value :ognl表达式,只能取栈顶的元素--%>

        2.2非根区取出数据:#Key值

      

<%--取非根元素--%>
<s:property value="#reqName"/><%--#键值--%>

      

    3.页面中通过OGNL执行方法

      默认情况下,不允许执行静态方法。需要在struts.xml中配置

 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

      方法调用同上面OGNL介绍。

struts基础3-把数据写入页面的更多相关文章

  1. SQL Server内存数据写入磁盘方法比较

    众所周知,SQLServer增删改数据最先都是在内存中进行的,这可以大大加快数据操作的速度: 当内存中的数据被修改了,而磁盘中的数据还没有被修改时,就产生了所谓的“脏页”,SQLServer是如何同步 ...

  2. ASP.Net MVC开发基础学习笔记(7):数据查询页面

     前言 前面铺垫了那么多,今天我们就用MVC5 + EF6 + Bootstrap3来正式创建一个基本查询页面. 为什么从查询页面開始?嘿嘿.由于小弟的.Net生涯就是从查询页面開始的,记得正式工 ...

  3. 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)

    https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...

  4. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  5. 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

      先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...

  6. PHP如何通过SQL语句将数据写入MySQL数据库呢?

    1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...

  7. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  8. MVC5 + EF6 + Bootstrap3 (10) 数据查询页面

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-search-page.html 系列教程:MVC ...

  9. 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件

    今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多 ...

随机推荐

  1. alias命令使用

    alias 别名 增加别名 alias vi=vim alias api='sudo apt-get install' alias apr='sudo apt-get remove' alias tz ...

  2. selenium官方网站文档,testng官方网站文档

    selenium 阅读至grid部分,当前没有远程需求,搁置:https://www.seleniumhq.org/docs/07_selenium_grid.jsp testng http://te ...

  3. 使用perconna xtrabackup备份脚本

    使用percona xtrabackup对两个数据库实例进行备份,备份的脚本如下所示: #!/bin/bash BASEDIR="/usr/local/mysql" BIN=&qu ...

  4. nginx location反向代理不对等时的处理

    server{ server_name git.cheyunhua.top; location /test12/ { proxy_pass https://www.baidu.com/;}} loca ...

  5. 三台机器之间ssh互信配置

    三台机器之间ssh互信配置 环境介绍:192.168.65.128    my1-222192.168.65.129  my2-223192.168.65.130    web224 # 步骤一:# ...

  6. printf不定参数

    title: printf不定参数 tags: C ARM date: 2018-10-21 12:14:58 --- 不定参数的传递 函数调用时参数传递是使用堆栈来实现的,参数入栈顺序是从右向左,在 ...

  7. java socket / No buffer space available

    s https://www.cnblogs.com/yiwangzhibujian/p/7107785.html Socket用在哪呢,主要用在进程间,网络间通信. https://www.cnblo ...

  8. JDBC-Batch 批量执行

    JDBC 批处理 SQL 语句 首先在 jdbc 的 url 中加上 rewriteBatchedStatements=true,只有开启了这个 Mysql 才会执行批处理,否则还是一条一条执行 St ...

  9. python 内置函数,匿名函数,sorted,filter,map,递归,二分法,冒泡算法 eval

    ############################总结#################################1. lambda 匿名函数 语法——lambda 参数:返回值 __na ...

  10. 关于Android Studio开发环境变量的设置(avd启动黑屏)

    之前因为乱按网上的设置导致启动avd启动黑屏,查了很久原来是ANDROID_AVD_HOME变量没有加$符号 以下是正确的环境变量配置 添加环境变量(注意avd中有一个$符号) ANDROID_SDK ...