一、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. plink:ped格式转换为bed格式

    命令行如下: plink --file FILENAME --make-bed --out FILENAME 第一个FILENAME的后缀为.ped和.map,生成的第二个FILENAME的后缀为.b ...

  2. python字符串的常用方法

  3. SpringCloud第一弹(入门)

    使用IDEA建立SpringBoot多模块工程不爽啊~算了凑合用吧. 第一步.建立一个POM工程 ..Next ..一路next即可,中间啥也不选 第二步.建立Eureka服务器(这个玩意等同于玩Du ...

  4. POJ 3678 Katu Puzzle (2-SAT)

                                                                         Katu Puzzle Time Limit: 1000MS ...

  5. 使用pip cmd安装包

    pip install matplotlib -i http://pypi.douban.com/simple --trusted-host pypi.douban.com,通过命令行安装的时候,指定 ...

  6. linux基本

    一.初识 Linux与windows相比的优点是:长期稳定的运行,避免了因为系统的问题导致的项目运行中断:占用资源少:开源软件多. Centos(Community Enterprise Operat ...

  7. mysql写shell小技巧

    set global general_log=on;set @file=0x653A2F2F7777772F2F782E706870;set global general_log_file=@file ...

  8. aerospike数据库配置

    https://blog.csdn.net/u011344514/article/details/53082757

  9. reportgen :python生产pptx

    欢迎关注博主主页,学习python视频资源 https://www.cnblogs.com/gasongjian/p/8670925.html reportgen v0.1.8 更新介绍 这段时间,我 ...

  10. C++ 二维数组作为形参传递使用实例

    在线代码编辑器: http://codepad.org/ 1.*指针 void display(int *arr, const int row, const int col) { ; i < r ...