ognl概述
- ognl是一种表达式,类似一EL表达式 但功能更加强大
- 在Struts2 里面操作的是值栈数据
- 一般把ognl在Struts2 中 和 Struts2 的标签一起使用
- ognl 不是 Struts2 的一部分,单独的项目 , 经常和Struts2 一起使用
- 需要导入jar包,Struts2 提供了jar包
ognl入门案例
1. 计算字符串的长度
.length();
1. 引入标签库
<%taglib uri="/struts-tags" prefix="s" %>
2. 计算长度
<s:property value="'haha'.length()">
3.页面结果
4
值栈
栈:后进先出
值栈的定义
- 之前web阶段,实在servlet中操作,在页面上用EL表达式取出
- 在Struts2 里面值栈就是一种作用域,可以存取值.
- 在action里面把数据放到值栈里面,在页面中获取到值栈数据.
- servlet 和 action的区别
- servlet 默认在第一次访问时创建
- action 在每次访问时创建
- 值栈的位置
- 每次访问都创建一个action对象
- 每个action都会有一个值栈
获取值栈对象
- 获取值栈有多种方式
使用ActionContext类的方式
//获取ActionContext
ActionContext context = ActionContext.getContext();
//调用方法得到值栈对象
ValueStack stack = getValueStack();
2.值栈的内部结构
值栈分为两部分
第一部分:root,结构是List集合
- 一般操纵都是root里面的数据 , root 继承了 ArrayList
第二部分:context,结构是Map集合
- 存储的是对象的引用
- key值固定 分别有
request request对象引用 session HttpSession对象引用 application ServletContext对象引用 parameters 传递相关的参数 attr(attribute简写) 使用attr获取域对象的值
debug 标签
- 访问action,执行action的方法有返回值,在jsp页面使用 debug 标签可以查看返回值
向值栈放数据
1. set方法 键值
//获取ActionContext
ActionContext context = ActionContext.getContext();
//调用方法得到值栈对象
ValueStack stack = getValueStack();
//放入数据
stack.set("uname","雷鸣");
2. push方法 字符串
//获取ActionContext
ActionContext context = ActionContext.getContext();
//调用方法得到值栈对象
ValueStack stack = getValueStack();
//放入数据
stack.push("abcd");
3. 成员属性 (最常用的)
//创建成员变量
private Users us;
//创建成员变量的getter 和 setter 方法
public Users getUs() {
return us;
}
public void setUs(Users us) {
this.us = us;
}
//在方法里写入数据
public String execute (){
us.setUname("雷鸣");
us.setPassword("123");
return "ok";
}
4.从值栈里面取数据
- 获取变量值
//获取变量值
<s:property value="uname">
- 获取对象的值
//获取对象的值
<s:property value="us.uname">
<s:property value="us.password">
- 获取List集合的值
//获取List集合的值
//第一种方式
<s:property value="list[0].uname">
<s:property value="list[0].password">
<s:property value="list[1].uname">
<s:property value="list[1].password">
...
//第二种方式 遍历
<s:iterator value="list">
<s:property value="uname">
<s:property value="password">
</s:iteratror>
//第三种方式
/**
* 加入var声明后
* 会把每次遍历的us对象放到context里面
* 获取context里面的特点:需要写ognl表达式
* 需要使用 # ;
*/
<s:iterator value="list" var="us">
<s:property value="#us.uname">
<s:property value="#us.password">
</s:iteratror>
5.EL表达式获取值栈数据
- EL表达式获取域对象的值
- 向域对象放入和取出值用 setAttribute 和 getAttribute
- 低层增强request对象里面的方法
- 首先从request 中取值,如果得到值,直接返回;
- 如果没有得到值,到值栈里把值取出来,并放入;域对象里面
获取域对象的值
- #request是域对象
<!-- 获取context里面数据,写ognl时候,首先添加符号 #context的key名称.域对象名称 -->
<s:property value= "#request.req"/>
表单标签 与 %
- Struts2标签中的表单标签
- 在Struts2 标签里使用ognl表达式,如果直接在Struts2表单标签里使用ognl表达式则不会识别,只有添加%后才可以识别
- 以前的写法
<input type="text" name="name" value="uname">
- Struts2 的写法
%{#域对象.属性名}
<s:textfield name="name" value="%{#request.uname}">