ognl

1. 什么是ognl
对象图导航语言
Struts内置的表达式语言,它比EL要强大很多。

------------------

2. 单独学习ognl
* EL它操作的数据来自于:四大域:pagecontext、request、session、application
* ognl操作的数据来自于:ognl上下文对象,以及root对象

OgnlContext它是一个Map,你不用对它有过多了解!

OGNL表达式以“#”开头!
OGNL表达式几乎与EL相同!

---------------------

OGNL的JavaBean操作

#emp.address.city,表示操作上下文中键为emp的javaBean,获取javabean的address属性的city属性。

---------------------

ognl的根对象
以"#"开头操作的是上下文中的对象:例如:#aaa.bbb,操作的是上下文中aaa这个对象
不以"#"开头操作的是根对象,例如:aaa.bbb,操作的是根对象的aaa属性的bbb属性。

==========================

ognl常量
1. 字符串常量:使用单引或双引括起来的字符序列,但如果是一个字符,那么必须使用双引。'abc'、''、"a"、'bb'
2. 字符常理:使用单引号括起来的单个字符
3. 布尔常量:与java相同,即只有true和false
4. null常量:与java相同
5. 数值常量:1.0、100

----------------------

ognl运算符

1. ognl运算符与java中的运算符相似,大多数相同。 +、-、.....
2. java中不存在的运算符:
* 逗号运算符:多个表达式使用逗号分隔,形成大的表达式,就是逗号表达式。
* 例如:1+2,2+3,4/2。从左到右依次运算所有表达式,整个表达式的值为最后一个表达式的值。
* 大括号表达式:用来创建ArrayList对象的!{1,2,3,4}
3. in和not in:判断当前值是否在集合中存在。
* in和not都在OGNL中为关键字!!!

4. 创建对象
* new java.utild.Date(),创建对象语法

-----------------------

ognl调用方法

1. 对象.方法(参数),例如:"'hello'.substring(1)",结果为ello

-----------------------

ognl操作静态的东西

1. 静态方法:"@java.lang.Math@min(10, 20)"

-----------------------

投影和选择

1. 向上下文中存放一个List
cxt.put("empList" empList);
2. 获取List中所有Emp对象的name属性值。(投影)
可以理解为:select name from emp;,即单列查询
#empList.{name} --> 它就是投影语法!

选择
 #empList.{条件},可以理解为:select * from emp where 条件。

三种语法:

1. #empList.{? 条件}:它表示获取所有满足条件的对象
2. #empList.{$ 条件}:它表示获取最后一个满足条件的对象
3. #empList.{^ 条件}:它表示获取第一个满足条件的对象

Struts中的OGNL

1. Struts中的上下文对象和根对象
ActionContext ac = ActionContext.getContext();
Map cxt = ac.getContextMap();//获取上下文对象!
甚至你都可以认为ActionContext就是Ognl上下文对象!

通常我们不会获取它,而是通过ActionContext对象来间接操作上下文对象。

根对象
ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();//获取值栈,它就是根对象!

它有push()用来压栈,还有pop()用来出栈

2. ActionContext中的5个Map
parameters:request.getParameterMap(),内容都是参数
request:所有request.getAttribute(),对应的是request域,例如:#request.user.usernmae,相当于request.getAttribute("user").getUsername()
session:session域
application:application域
attr:四大域, #attr.name,依次在四大域中查找,与EL的${name}

3. ValueStack
它是根对象,它也是一个集合。
ValueStack中一般都存放着当前Action对象!

========================================

在Struts中使用Ognl最多的地方是jsp页面,即在struts标签中!

1. <s:property value="ognl表达式"/>,它的作用是输出!

-------------

(默认在Struts中静态操作是被禁用的!这需要使用一个常量来打开!)

========================================

[N]语法

<s:property value="[1].name"/>

其中[1]表示一个子栈,从ValueStack的下标为1的元素开始,到栈底!
其中[1].name,在子栈中查找name,那么第一个元素变成了下标1的元素,而不在是下标0。

========================================

top语法

<s:proeprty value="top"/> top表示栈顶对象

以下没有区别,都是打印栈顶元素!
proeprty标签的value属性默认值为top
<s:proeprty/>
<s:proeprty value="top"/>
<s:proeprty value="[0].top"/>

========================================

开户静态访问功能

Struts中默认是不能访问静态方法和静态属性的,这需要通过配置一个常量来开户。
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />

========================================

EL访问ValueStack
pageContext, request(valuestack), session, application

1. 访问request域,其实就是调用request.getAttribute()方法来获取!
2. Struts对request进行了装饰!Struts对request的增强就是getAttribute()
3. getAttribute()访问会先去找request域,如果找不到去ValueStack

在EL访问request域时,调用的是getAttribute()方法,而这个方法先去request域找,没找到就去ValueStack去找,如果找到了,
那么request.getAttribute()就返回有值了

========================================

#、%、$

# --> 当访问上下文中的数据时,以#开头!
$ --> 在配置文件中使用ognl表达式,需要使用${...}
% --> 有些struts标签不支付ognl,那么若想让它支付需要使用%{...}
例如:<s:property value="name"/> property标签的value属性支持ognl表达式,但你也可以使用%{...},用了也白用!
<s:property value="%{name}"/>,同上!

例如:<s:hidden value="name"/> hidden标签的value属性不支持ognl表达式,那么如果想使用ognl必须使用%{...}
<s:hidden value="%{name}"/>

<s:xxx value="%{name}"/> --> 肯定是ognl
<s:yyy value="%{'name'}"/> --> 肯定是字符串name

========================================

Action向页面传递数据

1. String数据
this.addFieldError()
this.addActionError()
this.addActionMessage()

<s:fielderror/>
<s:actionerror/>
<s:actioinmessage/>

2. 复杂数据
ActionContext.getContext().getValueStack().push(userList);
页面使用循环标签来遍历

ActionContext.getContext().getValueStack().push(user);
页面可以使用<s:property/> 来取!

<s:property value="username"/>
<s:property value="password"/>

--------------------------------

class MyAction {
private User user;

public String execute() {
this.user = service.findByUid("u_001");//把从数据库中查询到的对象保存到Action的属性中
}
}

页面:
<s:prooperty value="user.username"/>
<s:prooperty value="user.password"/>

--------------------------------

<s:debug/>它会在页面中生成一个超链接,你点击它就可以看到上下文和值栈的内部结构!

struts2框架之OGNL(参考第三天学习笔记)的更多相关文章

  1. struts2框架之文件下载(参考第三天学习笔记)

    下载 1. 下载是一种响应方式 正常的响应:响应正文是html:response.getWriter().print("html"); 下载的响应: 1.一个流:字节数据:resp ...

  2. struts2框架之文件上传(参考第三天学习笔记)

    上传 1. 上传对表单的要求 * method=post * enctype=multipart/form-data 2. 上传对servlet要求 * getParameter()不能再使用! -- ...

  3. JavaWeb_(Struts2框架)Struts创建Action的三种方式

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  4. struts2框架之OGNL表达式概述(在代码中使用OGNL表达式)

    1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象 * 通 ...

  5. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  6. 《Linux内核分析》第三周学习笔记

    <Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...

  7. Linux内核分析第三周学习笔记

    linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  8. 《Linux命令、编辑器与shell编程》第三版 学习笔记---002

    <Linux命令.编辑器与shell编程>第三版 学习笔记---001 Linux命令.编辑器与shell编程 Shell准备 1.识别Shell类型 echo  $0 echo $BAS ...

  9. Struts2框架的基本使用(三)

    上篇 Struts2框架的基本使用(二)介绍了Action和result的相关配置操作,本篇接着介绍剩下的异常处理机制和Convention插件的使用.下篇文章介绍的是Struts2框架中标签库的使用 ...

随机推荐

  1. 谈谈关于PHP连接数据库的两种方法(PDO&Mysqli)

    前言:在我们之前学习sql语句的时候都是停留在黑窗口的,怎样才能让mysql与程序代码发生联系呢?此时PDO和Mysqli应运而生,为了解决这个问题 (一)开启其中(pdo或者mysqli)的php扩 ...

  2. Linux 命令详解(十二)Systemd 入门教程:使用定时器发送邮件(mail)

    Systemd 定时器教程:http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html 一.定时任务 Systemd 定时任务:每小时发送一封电 ...

  3. MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数

    一,问题描述 [使用 unwind 操作符 “解包” Document 里面的Array中的每个元素,然后使用 group 分组统计,最后使用 sort 对分组结果排序] 从 images.json ...

  4. MySQL 字符集问题

    MySQL 支持许多字符集及其编码方案, 甚至是不同编码之间的转换. 在使用 MySQL 进行应用程序编程时, 常常会出现乱码现象, 这通常是由于客户端没有声明与 MySQL 服务器通信的字符串编码造 ...

  5. 普通用户从其他主机连接MySQL数据库

    一.登陆数据库 mysql -u root -p [超级用户密码]; 二.创建新用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 参 ...

  6. error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    解决方案 1. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件(我的Twisted‑17.5.0‑cp36 ...

  7. hadoop1.2.1的安装

    前提:1.机器最好都做ssh免密登录,最后在启动hadoop的时候会简单很多 免密登录看免密登录 2.集群中的虚拟机最好都关闭防火墙,否则很麻烦 3集群中的虚拟机中必须安装jdk. 具体安装步骤如下: ...

  8. java基础之自定义异常类及throw和throws的区别

    一.异常的架构: Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception. Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟 ...

  9. 使用WebSocket帮助应用程序群集节点间通信

    [序列化message传输方式]两种方式都是转成二进制. 1.使用Java序列化器,ObjectXXXputStream 2.使用ByteBuffer.wrap(bytes). 在一个标准群集场景中, ...

  10. luogu P3245 [HNOI2016]大数

    传送门 \(HNOI2019\)前最后一题了qwq 这题要分情况,如果\(p=2\)或\(5\),那么只要区间内最后一个数字是\(p\)的倍数就好了,这个可以莫队,也有更优秀的做法.莫队做法可以看代码 ...