Struts(五)之OGNL、contextMap
一、OGNL
1.1、定义
OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。它是一种功能强大的表达式语言,
通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
1.2、OGNL的功能
1.2.1、支持普通方法的调用
基础:<s:property value="">类似于jsp中的表达式(jsp表达式是<%= %>,el中的表达式是${}),把value的值直接输出到页面上
value的属性值就是OGNL的表达式,注意它不是一个字符串。如果想把value中的值当作普通的字符串,请加引号。
注意:el表达式只能调用静态的方法,而ognl可以访问普通方法就像上面的length方法
1.2.2、访问静态成员(静态属性、静态方法)
1.OGNL访问静态属性
方式:@全类名@静态属性名称
2.OGNL访问静态方法
方式:@全类名@静态方法名
注意:在struts2中,OGNL默认禁用静态方法,在default.properties中struts.ognl.allowStaticMethodAccess=false之控制,
所以我们要在struts.xml中配置
1.2.3、OGNL操作map和list集合
1.3、OGNL的功能实现
1、存取对象的任意属性,简单说就是对javabean进行操作(重要)
2、调用对象方法。
3、调用类的静态方法
4、索引数组元素
5、操作集合(重 要)
操作之前必须知道如何使用OGNL表达式,并且了解OGNL表达式的取值范围只能在其context和root中,格式为
Ognl.getValue(expression,context,root);
//expression:为我们编写的ognl表达式,从后两个参数中获取值,获取规则会从下面的例子中详细讲解
//context:ognl的上下文,类型为map,
//root:ognl的根,可以为javabean、list、map、.... 等等很多值
1、对javabean进行操作
User.java
Address.java
获取javabean中的属性值
获取javabean中的对象的属性值
对javabean中的属性进行赋值操作
2、调用对象方法
3、调用类的静态方法或属性
4、索引数组元素
5、操作集合
操作list集合,list结合本质就是一个数组,所以从list中读取数据跟对数组的操作是一样的。
操作map集合
创建list集合
创建map集合
二、ccontextMap(重点)
2.1、动作类的生命周期
明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的区别是,struts1的动作类是单例的。
2.2、请求动作的数据存放
每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
明确:
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。
2.3、contextMap存储数据
Struts2的官方文档对contextMap的说明:
注意:除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
2.4、查看contextMap中的数据
在jsp中引入struts2的核心标签库,然后使用<S:debug />
测试存入数据
三、contextMap中的数据操作
3.1、存数据
需要熟悉ActionContext和valueStackAPI.框架会为我们存数据
3.1.1、使用ActionContext存数据
在demo1.jsp点击dubug时
3.1.2、使用ValueStack存数据
结果:
ValueStacj中的getRoot()方法
CompoundRoot类是什么:
在动作类中写一个栈操作
3.2、取数据
用Struts2的标签(OGNL表达式)在JSP上(用的最多)
使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。
3.2.1、取得contextMap中的数据,需要是要#
使用s:property取数据
在demo1.jsp中
3.2.2、取ContextMap里面ValueStack中对象的属性:直接写属性名
结果:
如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置
3.3、OGNL的使用总结
取根中的对象属性不使用#
取contextMap中的key的值,要使用#
3.4、ValueStack的其他方法
1.setValue()方法
jsp中
结果:
在debug中
Stack Context
2.set方法
Struts(五)之OGNL、contextMap的更多相关文章
- Struts中的OGNL和EL表达式笔记
Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ...
- Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...
- Struts(十一):OGNL表达式(二)
Map栈 :request,session,application的一个属性值或一个请求参数的值. 若想访问ContextMap里的某个对象的属性,可以使用以下几种之一: #object.proper ...
- Struts(十):OGNL表达式(一)
Struts2 用s:porperty标签和OGNL表达式来读取值栈中的属性值: I.值栈中的属性值: 1.对象栈:读取对象栈中的某一个对象的属性值: 2.Map栈 :request,session, ...
- Struts 2 之 OGNL
OGNL概述 Object-Graph Navigation Language,对象图导航语言 1.能够访问对象的方法,如list.size() 2.能够访问静态属性与静态方法,需要在类名前加上@,如 ...
- 在Apache Struts中利用OGNL注入
前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...
- JavaWeb -- Struts 数据传输:OGNL和类型转换
1. 数据传输:OGNL和类型转换 OGNL和struts2 OGNL:Object-Graph Navigation Language. OGNL是集成进struts框架中比较强大的技术有助于数据传 ...
- struts2学习笔记(五)—— OGNL
一.OGNL概述 1.1 什么是OGNL OGNL的全称是对象图导航语言( object-graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可 ...
- Struts(五)
前端和后端验证 1.前端:用户体验 2.保证程序的安全性 ================================验证框架========================== ...
随机推荐
- mybatis中mapping文件like查询方式
方式1: select * from person where name like "%"#{name}"%" 方式2: select * from perso ...
- ACM入门:第s名的小红
前几天的大一新生赛自己也跟着做了做,顺便测测后台数据有没有bug,这是一道排序题,题目如下: Problem Description 小红总是排第二,有点不服气,现在她想知道一个序列中第二小的数字是多 ...
- JavaScript中国象棋程序(8) - 进一步优化
在这最后一节,我们的主要工作是使用开局库.对根节点的搜索分离出来.以及引入PVS(Principal Variation Search,)主要变例搜索. 8.1.开局库 这一节我们引入book.js文 ...
- 给ubuntu安装VNC远程桌面
(只有背景,没有菜单栏问题没有解决)Virtual Network Computing(VNC)是进行远程桌面控制的一个软件.客户端的键盘输入和鼠标操作通过网络传输到远程服务器,控制服务器的操作.服务 ...
- java中使用正则表达式匹配字符串
在Java中使用正则表达式去匹配相应的字符串: String importFileRole = "(import)\\s*[a-zA-Z0-9_<>.]+\\;";// ...
- 【Zookeeper】源码分析之网络通信(一)
一.前言 前面已经分析了请求处理链中的多数类,接着继续分析Zookeeper中的网络通信模块. 二.总体框图 对于网络通信模块,其总体框图如下所示 说明: Stats,表示ServerCnxn上的统计 ...
- 初探Lambda表达式/Java多核编程【4】Lambda变量捕获
这周开学,上了两天感觉课好多,学校现在还停水,宿舍网络也还没通,简直爆炸,感觉能静下心看书的时间越来越少了...寒假还有些看过书之后的存货,现在写一点发出来.加上假期两个月左右都过去了书才看了1/7都 ...
- Thread类常用方法
Thread类构造方法: 1.Thread(): 2.Thread(String name): 3.Thread(Runable r): 4.Thread(Runable r, String name ...
- SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)
前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...
- mac air 上的Linux命令训练(1)
1.cat命令 作用: 读取一个文件的全部内容,并将它输出,如果将它输出到一个目标文件,目标文件将会被替换掉. 参数: -n : 加上行号输出 -b:加上行号,但是不加空白行,输出 -s:当遇到多行空 ...