struts基础3-把数据写入页面
一、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-把数据写入页面的更多相关文章
- SQL Server内存数据写入磁盘方法比较
众所周知,SQLServer增删改数据最先都是在内存中进行的,这可以大大加快数据操作的速度: 当内存中的数据被修改了,而磁盘中的数据还没有被修改时,就产生了所谓的“脏页”,SQLServer是如何同步 ...
- ASP.Net MVC开发基础学习笔记(7):数据查询页面
前言 前面铺垫了那么多,今天我们就用MVC5 + EF6 + Bootstrap3来正式创建一个基本查询页面. 为什么从查询页面開始?嘿嘿.由于小弟的.Net生涯就是从查询页面開始的,记得正式工 ...
- 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)
https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
先看一下我要实现的功能界面: 这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...
- PHP如何通过SQL语句将数据写入MySQL数据库呢?
1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- MVC5 + EF6 + Bootstrap3 (10) 数据查询页面
文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-search-page.html 系列教程:MVC ...
- 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件
今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多 ...
随机推荐
- python(一)——初识与变量
---恢复内容开始--- #!/usr/bin/env python #-*- coding:utf8 -*- print('你好hello world') 第一行,主要用于Linux中环境变量,wi ...
- 转:upload.parseRequest为空
上传是items一直是空list.导致原因是struts2把原始的原来S2为简化上传功能,把所有的enctype="multipart/form-data"表单做了wrapper最 ...
- 114. Flatten Binary Tree to Linked List(M)
. Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ...
- (四点共面) 51nod1265 四点共面
1265 四点共面 1 秒 131,072 KB 0 分 基础题 给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面).如果共面,输出"Ye ...
- 流明(lux)和坎德拉;
流明是光照度: 坎德拉是光强: 流明是光通量的单位, cd是光强单位 光强是单位立体角的光通量: 照度是单位面积的光通量: 尼特是亮度单位 1尼特 = 1CD/m^2: 1 lx = 1 流明每 ...
- 在中国使用苹果Mac电脑的都是些什么人?
来源:PConline 资讯 文章收录于:风云社区(提供上千款各类Mac软件下载) (图片来源于互联网分享,如涉及版权问题请联系作者删除) 在中国用Mac的都是什么人?腾讯CDC用户研究中心对 Q ...
- 流畅的python--python数据模型
python最好的品质之一就是一致性.初步接触python可能会len(collection)而不是collection.len()觉得不适应,这是通常所说的“python风格”(Pythonic)的 ...
- sql server开发工具
查询分析器的使用 SQL语言包含四个部分: 1.数据定义语言(DDL) : 例如 create, drop, alter等语句 2.数据操作语言(DML) : 例如 insert,delete, up ...
- 浅析基于ARM的Linux下的系统调用的实现
在Linux下系统调用是用软中断实现的,下面以一个简单的open例子简要分析一下应用层的open是如何调用到内核中的sys_open的. t8.c 1: #include <stdio.h> ...
- urllib 学习一
说明:Urllib 是一个python用于操作URL的模块 python2.x ----> Urillib/Urllib2 python3.x ----> Urllib ...