1.OGNL表达式
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写, 是一个使用简单,功能强大的,开源的表达式语言, 可以方便地操作任何对象属性,方法等. Struts2框架使用OGNL作为默认的表达式语言, 主要用于页面的取值. 它类似于EL表达式语言, 但比EL语法强大很多
用法:
OGNL是类似于EL的, 用于页面上取后台的值, 但是OGNL表达式需要结合s标签来使用
(1) 直接显示一个值
(2)调用对象的方法或属性
(3)可以直接调用类里的静态方法, 把调用静态方法的开关打开
(4)计算某个表达式的值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
Insert title here
演示ognl的几种用法
直接在页面上显示一个值:
调用对象里的方式:
直接调用类里静态方法:
算术运算:
注意: 在调用静态方法时, 需要把静态方法调用的开关打开, 默认是关闭的
2. 值栈
什么是值栈: 值栈是struts2框架的数据中转站, 里面保存了当前Action对象和web对象引用(page, request, session, application, arrt, paramertes), 也可以手动保存自己的对象, 同时也可以随时将这些对象从值栈中取出来
值栈在哪: 每个请求都会产生一个值栈, 会放在request域中, 名字struts.valueStack
获取值栈的两种方式:
(1) 从request域中获取
(2) 通过ActionContext中的getValueStack方法获取
值栈包含两个逻辑部分: 对象栈和上下文栈
对象栈(List)存放: Action对象+其他对象
上下文栈(Map)存放: Action对象, web对象的引用, 其他对象
3. 值栈的存放数据
struts2框架会自动将当前Action的对象存放到对象栈中
3.1 如何向对象栈手动存放数据
对象栈是栈结构, 先进后出, 所有后方的元素在上边
(1) 匿名存放
(2) 有名字的存放, 实质上存放的是一个Map对象
@Override
public String execute() throws Exception {
ValueStack valueStack = ActionContext.getContext().getValueStack();
//匿名存放
valueStack.push("木木");
//有名存放
valueStack.set("username", "木木");
return SUCCESS;
}
3.2 如何向上下文栈里手动存放数据
@Override
public String execute() throws Exception {
ValueStack valueStack = ActionContext.getContext().getValueStack();
//向上下文栈存放数据
//valueStack.getContext().put("username", "木头");
ActionContext.getContext().put("username", "木木");
return SUCCESS;
}
4. 值栈的获取数据
注意: 获取值栈中的数据需要通过OGNL表达式结合s标签来获取,
4.1 如何获取对象栈里的数据
获取对象栈中的数据不需要加#
根据属性名取值:
根据序号取值:
[0].top表示取对象栈里的第一个元素, 因为栈顶是一个map, 我们需要取出map里username这个key的值, 所以这么写[0].top.username
4.2 如何获取上下文栈里的数据
加#号来取上下文栈中的数据
例:
5. 值栈的搜索顺序
(1). 如果不加#号, 先搜索对象栈, 再搜索上下文栈, 如果都搜索不到, 就不显示; 如果中途搜索到, 立即停止搜索
(2). 如果加#号, 直接搜索上下文栈, 如果搜索不到, 就不显示
把数据放到对象栈中有两种方法:
(1) 可以手动获取值栈, 手动把值存放进去
(2) 也可以直接在Action类中定义属性并提供get方法, 也能把数据放到对象栈中, 因为当前Action对象会自动保存到对象栈中, 那么里面的属性也在对象栈中
值栈的生命周期:
1.每一个请求都会产生一个值栈对象, 放在request的域中, 名字叫做struts.valueStack
2. 值栈的生命周期同request的生命周期
3. 值栈贯穿整个Action的生命周期
6. OGNL表达式对值栈的操作方法
6.1 #号的用法 : 从值栈的上下文栈中取值. 如果不加#, 就是优先从对象栈里取
加#号可以取pageContext,request,session,application,attr,parameters;
attr:依次寻找pageContext---->request---->session----->application
parameters:取请求中的参数值,取出的是一个数组,再通过[0]取出具体的值
取request域中的值:
取session域中的值:
取application域中的值:
取page域中的值:
取参数值:
#号还可以用来构造map集合和list集合
#的用法:构造集合
构造List集合,不要加#
构造map集合:
:
6.2 %号的用法
作用:
告诉执行环境, 把字符串当成OGNL表达式来解析
告诉执行环境, 把一个OGNL表达式不要进行解析, 直接看成一个字符串
6.3 $号的用法
作用: 用于在配置文件(struts.xml) 里取值栈里的值