一、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. 第十四篇-ImageButton控制聚焦,单击,常态三种状态的显示背景

    这里先用XML设置. myselector.xml <?xml version="1.0" encoding="utf-8"?> <selec ...

  2. Redis的主从复制的原理介绍

    redis主从复制 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或 ...

  3. nginx变量(日志log_format)

    nginx变量(日志log_format) HTTP请求变量 - arg_PARAMETER.http_HEADER.sent_http_HEADER 它是指http请求中的变量,举例: curl访问 ...

  4. break #立即终止本次循环

    #!/user/bin/python# -*- coding:utf-8 -*-# print(111)# while True:# print(222)# print(333)# break #立即 ...

  5. Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小

    Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...

  6. java中用jdom创建xml文档/将数据写入XML中

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...

  7. Java NIO系列教程(八)JDK AIO编程

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  8. jmeter元件执行顺序及简介

    最近在学习Jmeter,在进行实操之前,先查看了官方文档.因为官方文档是英文的,为了方便以后查看,自己翻译了一部分,中间个别地方根据自己的理解简单地翻译了部分.如果翻译等有问题,欢迎指正. 一.执行顺 ...

  9. Uncaught DOMException: Failed to construct 'WebSocket': The URL '/qibao/websocket/service1000' is invalid.

    出现这个问题是构造 WebSocket失败了. js代码改成 //实现化WebSocket对象,指定要连接的服务器地址与端口 建立连接//等同于socket = new WebSocket(path+ ...

  10. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager

    8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...