一、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. 关于在JTextPane(或JEditorPane)中返回文本部分(Text)

    今天遇到这样的一个问题,我需要取得当前JTextPane()中的文件,但是 JTextPane.getText()返回的是网页的HTML源代码,在网上搜索了一下,找到了一个方法: //返回消息框的无格 ...

  2. Remote debugger is in a background tab which may cause apps to perform slowly. Fix this by foregrounding the tab (or opening it in a separate window).

    先上代码: /** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow * ...

  3. 第三十六节,目标检测之yolo源码解析

    在一个月前,我就已经介绍了yolo目标检测的原理,后来也把tensorflow实现代码仔细看了一遍.但是由于这个暑假事情比较大,就一直搁浅了下来,趁今天有时间,就把源码解析一下.关于yolo目标检测的 ...

  4. cmd解压压缩包

    需要安装有winrar start winrar x C:\Users\systme\Desktop\xxx.rar c:\123

  5. ttribute "xmlns" was already specified for element "web-app".

    今天导入了,一个javaweb项目,当自己对项目进行重命名的时候时候,但是web.xml直接爆出来一个"ttribute "xmlns" was already spec ...

  6. 基础教程:Mac 电脑小白应该了解哪些东西?

    文章素材来源:知乎 文章收录于:风云社区(www.scoee.com),提供1700多款mac软件下载. 本文提供给那些从 PC 阵营初入 Mac 的同学而准备的,我们希望从硬件和软件.设计风格和使用 ...

  7. linux ssh 报错failed - POSSIBLE BREAK-IN ATTEMPT

    linux ssh 报错failed - POSSIBLE BREAK-IN ATTEMPT 问题故障: 今天在新租的虚拟机上,发现ssh登陆机器的时候报错,如下: [root@pictures_ne ...

  8. percona-5.7二进制多实例安装

    percona-mysql-5.7二进制多实例安装 规划:端口号     配置文件     备注3306 /data/mysql/mysql_3306/my_3306.cnf 3307 /data/m ...

  9. 《Apache kafka实战》读书笔记-kafka集群监控工具

    <Apache kafka实战>读书笔记-kafka集群监控工具 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如官网所述,Kafka使用基于yammer metric ...

  10. js异步下载文件请求

    注意 :通常下载文件是用get请求 window.location.href=url; 但是 我们需要下载完成监听,所以必须要异步执行.用常规的ajax是不可以的.我们要用blob对象来实现1.原生的 ...