一、OGNL入门
1、什么是OGNL
OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言。使用这种表达式语言,可以通过使用某种表达式语言,来存取Java对象的任意属性,调用Java的方法,同时能够自动实现必要的数据类型转换,
2、OGNL的作用
Struts2默认的表达式语言就是ognl表达式语言,该语句具有以下的特点
-
-
- 支持对象方法的调用。例如:objectName.methodName().
- 支持静态方法调用和值访问,表达式的格式为@[类全名]@[方法名 | 值名] 例如:@java.lang.String@format('foo %s','bar')。
- 支持赋值操作和表达式串联。
- 访问OGNL上下文对象(OGNL Context)和ActionContext
- 操作集合对象。
-
3、OGNL表达式的要素
(1)表达式
表达式是整个OGNL表达式的核心,OGNL会根据表达式中的对象去取值。
(2)根元素(root)
root元素可以理解为OGNL表达式要操作的对象
(3)context
context对象中保存了对象的引用的map集合
4、OGNL表达式实例
使用OGNL表达式获取字符串的长度
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--要使用struts2标签,必须要引入struts2标签库 --%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%-- 1、ognl表达式必须要在struts2标签中使用 2、在ognl表达式中可以直接调用Java的方法 3、value的值就是ognl表达式 --%> <s:property value="'hello ongl'.length()"/> </body> </html>
二、struts2的值栈
1、什么是值栈
值栈(ValueStack)是Struts的一个接口,ognlValueStack是该接口的一个实现类,客户端发起一个action请求时会创建一个action实例同时也会创建一个值栈实例,该值栈贯穿整个Action的生命周期,struts2使用ognl将请求action的参数封装为对象存储到值栈中去,并通过ognl表达式去读取值栈中对象属性的值
2、Struts2 与值栈
在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值。
(1)在action里面把数据放到值栈里面,在页面中获取到值栈数据
3、Action与Servlet的不同点
(1)Servlet:默认在第一次访问时候创建,创建一次,单实例对象
(2)Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象
4、值栈的存储位置
(1)值栈存储在Action对象中,
(2)在每个action对象里面都会有一个值栈对象(只有一个)
5、值栈的内部结构
可以使用struts2的<debug>标签来查看值栈的内部结构
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <s:debug></s:debug> </body> </html>
通过该标签查看到的结构如下图:
说明:在图中可以看到该值栈中有两块数据,一个是root,一个是context。
(1)在我们的使用中一般都是操作root,操作context比较少。
(2)root的内部结构是list结合,context内部的结构是map集合。
(3)context中主要存储的是一些对象的引用。