学习Struts--Chap05:值栈和OGNL
1、值栈的介绍
1.1 值栈的介绍:
值栈是对应每一个请求对象的数据存储中心,struts2会给每一个请求对象创建一个值栈,我们大多数情况下不需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据就可以了,这样就大大的降低了开发人员的工作量和逻辑复杂性。
1.2 值栈的作用:
值栈能够线程安全的为每一个请求对象提供公共的数据存取服务。它可以统一管理页面和action之间的数据,供action、result、interceptor等使用。值栈和请求时一一对应的,也是唯一对应的,每一个请求有且只有唯一的一个值栈。不同的请求,值栈也不一样,值栈封装了一次请求所有操作的相关数据。正是因为值栈和请求的对应关系,因而值栈能保证每个请求访问数据时的线程安全。
1.3 值栈包含的内容:
值栈分为狭义范围上的值栈和广义范围上的值栈。
- 狭义范围上的值栈:狭义值栈中存放着一些OGNL可以存取访问的数据,主要是指:
- action实例,这样就可以通过OGNL来访问action实例中的属性的值
- OGNL表达式运算的值
- OGNL表达式产生的中间变量,比如Struts2标签,在JSP中使用标签,可以访问值栈中的数据。
- 广义范围上的值栈:指的是ActionContext对象,actioncontext对象是action运行的上下文,每个actioncontext都是一个容器,包含着action运行所需要的数据,比如参数,会话等。
- 请求参数中的数据:#parameters
- 请求作用域中的数据:#request
- 会话作用域中的数据:#session
- 应用程序中的数据:#application
2、OGNL的介绍
2.1、OGNL的概述
OGNL是对象图导航语言(Object-Graph Navigation Languaged)的英文缩写,是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型的转化功能。它使用相同的表达式去存取对象的属性。如果把表达式看作一个带有语义的字符串,那么OGNL就是这个语义字符串与java对象之间沟通的桥梁。
2.2、OGNL的三要素
表达式:OGNL就是根据表达式去对象中取值,所有的OGNL操作都是指对表达式解析并执行操作的过程。表达式用于指明此次OGNL操作要做什么。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。
根对象(ROOT):Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“对谁执行操作"。OGNL称为对象图导航语言,所谓对象图,就是以任意对象为根,通过OGNL可以访问这个对象关联的其他所有对象。
Context对象:OGNL的取值需要一个上下文环境,通过设置Root对象,OGNL就可以对root对象进行取值或者写值等操作,root对象所在的环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的要执行的操作“在哪里进行”。上下文环境Context是一个map类型的对象,在表达式中访问Context中的对象,需要使用”#”号加上对象名称,即“#对象名称”的形式。
3、OGNL访问VauleStack数据的操作
在展示界面取出值栈中的数据:
<body>
Name:<s:property value="name" /><br/>
Age:<s:property value="age" />
</body>
在Action中设置数据:
@Override
public String execute() throws Exception {
ActionContext actionContext = ActionContext.getContext();
ValueStack valueStack = actionContext.getValueStack();
valueStack.set("name", "baozi(ValueStack)");
valueStack.set("age", 24);
return SUCCESS;
}
4、OGNL访问ActionContext数据的操作
4.1、请求参数中的数据:#parameters 请求参数 request.getParameter(...);
4.2、请求作用域中的数据:#request 请求作用域中的数据 request.getAttribute(...);
4.3、会话作用域中的数据:#session 会话作用域中的数据 session.getAttribute(...);
4.4、应用程序作用域中的数据:#application 应用程序作用域中的数据 application.getAttribute(...);
4.5、#attr的用法:#attr 按照 page request session application 顺序查找值
在Action中设置数据:
package com.java1234.action;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext; public class HelloAction2 implements Action { @Override
public String execute() throws Exception {
ActionContext actionContext = ActionContext.getContext(); // 在Action中设置session值
Map<String, Object> session = actionContext.getSession();
session.put("name", "张三(Session)");
session.put("age", 17); // 在Action中设置application值
Map<String, Object> application = actionContext.getApplication();
application.put("name", "李四(application)");
application.put("age", 24);
return SUCCESS;
} }
在struts.xml中配置映射关系:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="helloWorld" extends="struts-default">
<action name="hello" class="com.java1234.action.HelloAction2">
<result name="success">success2.jsp</result>
</action>
</package>
</struts>
在展示界面取出值栈中的数据:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>
<%
request.setAttribute("name", "BaoZi(parameters)");
request.setAttribute("age", 11);
%>
</head>
<body>
请求参数中的数据:<s:property value="#parameters.name"/><br/>
<s:property value="#parameters.age"/><hr/>
请求作用域中的数据:<s:property value="#request.name"/><br/>
<s:property value="#request.age"/><hr/>
session作用域中的数据:<s:property value="#session.name"/><br/>
<s:property value="#session.age"/><hr/>
application作用域中的数据:<s:property value="#application.name"/><br/>
<s:property value="#application.age"/><br/>
</body>
</html>
访问地址:localhost:8080/HeadFirstStruts2Chap01/hello?name=HeiHei&age=15
5、OGNL访问复杂对象
5.1、访问javaBean对象
5.2、访问集合对象
5.3、访问Map对象
Student对象:
package com.java1234.model;
public class Student {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在Action中设置数据:
package com.java1234.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.java1234.model.Student;
import com.opensymphony.xwork2.Action; public class HelloAction3 implements Action { //定义一个JavaBean对象的引用变量:
private Student student;
//定义一个List<Student>对象的引用变量:
private List<Student> students;
//定义一个Map<String, Student>对象的引用变量:
private Map<String, Student> studentMap; public Map<String, Student> getStudentMap() {
return studentMap;
}
public void setStudentMap(Map<String, Student> studentMap) {
this.studentMap = studentMap;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
} @Override
public String execute() throws Exception {
//在action中给javaBean对象设置值
student = new Student("xiaohong", 10); //在action中给list集合设置值
students = new ArrayList<Student>();
students.add(new Student("xiaoqing", 17));
students.add(new Student("xiaohua", 16)); //在action中给Map对象设置值
studentMap = new HashMap<String, Student>();
studentMap.put("boy", new Student("jianguo", 5));
studentMap.put("girl", new Student("xiaoxiang", 4));
return SUCCESS;
} }
在struts.xml中配置映射关系:同上边OGNL访问ActionContext数据的操作使得配置文件一样
在展示界面取出值栈中的数据:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>
OGNL访问javaBean对象:
<s:property value="student.name"/>
<s:property value="student.age"/><hr/>
OGNL访问List集合对象:
<s:property value="students[0].name"/>
<s:property value="students[0].age"/><br/>
<s:property value="students[1].name"/>
<s:property value="students[1].age"/><hr/>
OGNL访问Map集合对象:
<s:property value="studentMap['boy'].name"/>
<s:property value="studentMap['boy'].age"/><br/>
<s:property value="studentMap['girl'].name"/>
<s:property value="studentMap['girl'].age"/><hr/>
</body>
</html>
访问地址:localhost:8080/HeadFirstStruts2Chap01/hello
6、OGNL访问静态属性和方法
创建一个包含静态属性和静态方法的类:MyStatic
package com.java1234.common;
public class MyStatic {
public static final String str = "OGNL访问静态属性!";
public static String print() {
return "OGNL访问静态方法!";
}
}
在配置文件中开启允许静态方法执行:
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
在ognl_static.jsp页面展示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>
OGNL访问静态属性:
<s:property value="@com.java1234.common.MyStatic@str"/><hr/>
OGNL访问静态方法:
<s:property value="@com.java1234.common.MyStatic@print()"/>
</body>
</html>
学习Struts--Chap05:值栈和OGNL的更多相关文章
- 关于Struts2中的值栈与OGNL表达式
1.1.1 OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL :OGNL比EL功能强大很多倍. 它是一个开源项目. ...
- Struts2的值栈和OGNL牛逼啊
Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...
- Struts2学习记录-Value Stack(值栈)和OGNL表达式
仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...
- Struts2基础学习(七)—值栈和OGNL
目录: 一.值栈 二.OGNL表达式 一.值栈(ValueStack) 1.定义 ValueStack贯穿整个Acton的生命周期,每个Action类的对象实例都拥有一个ValueStack ...
- Struts(九):值栈(OGNL)
引言 在我们开发过程中,往往会使用一个对像传递到一个具体的action中,之后到跳转页面中访问对应对象的具体的参数. 比如:我们搭建一个struts2项目: 回顾下如何搭建strut2: 1.下载的s ...
- (四)值栈与OGNL
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:值栈简介 值栈是对应每个请求对象的一套内存数据的封装,Struts2 会 ...
- 值栈和OGNL 之 7.1 值栈
7.1 值栈 7.1.1 值栈是什么 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Resu ...
- 值栈与ognl
ValueStack (值栈): 1.贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个ValueStack对象).相当于一个数据的中转站.在其中保存当前Action对象和其他相关 ...
- struts框架值栈问题二之值栈的内部结构
2. 问题二 : 值栈的内部结构 ? * 值栈由两部分组成 > root -- Struts把动作和相关对象压入 ObjectStack 中--List > context -- Stru ...
随机推荐
- Windows 添加永久静态路由
route add -p 10.10.0.0 mask 255.255.0.0 10.10.6.1 -p 参数: p 即 persistent 的意思 -p 表示将路由表项永久加入系统注册表
- C# 操作windows服务[启动、停止、卸载、安装]
主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...
- [转] Mongoose 参考手册
Mongoose 参考手册 标签(空格分隔): MongoDB Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据 ...
- la 4490
题解: 这道思路还是比较水的 我们可以等价变形成hi<=7 我们的最优决策是把抽出来的那些相同颜色的书最后插在一起(所以要统计序列中还有没有相同元素的书) f[i][j][k][x]表示前i本书 ...
- 【CF662C】Binary Table(FWT)
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...
- NEST 中的距离单位
Distance units Version: 5.x 英文原文地址:Distance units 当我们需要指定距离时(地理位置查询),可以使用一个双精度的数字来表示,它的默认单位是米(meters ...
- Centos6.5系统压力测试过程大量TIME_WAIT
统计tcp状态的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' netstat -n | awk '/ ...
- Flink--Window apply
和window的操作类似,只不过操作更加灵活,具体的操作需要在匿名内部类的方法中实现:当有比较复杂的需求时候,可以使用: object WindowApply { def main(args: Arr ...
- ELK使用2-Kibana使用
一.创建kibana索引 1.es索引可以在这儿查看 2.kibana创建索引可以在这儿查看(必须es中存在相应的索引才能在kibana中创建) 点击创建然后选择es中存在的索引即可创建相应的索引 3 ...
- linux系统虚拟机下安装jdk
首先需要得到可以创建文件和上传文件的权限 . 将下载好的jdk文件上传到指定的文件目录下. tar -zxvf jdk-8u60-linux-x64.tar.gz 解压到当前文件下 会 ...