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数据的操作

在展示界面取出值栈中的数据:

  1. <body>
  2. Name:<s:property value="name" /><br/>
  3. Age:<s:property value="age" />
  4. </body>

在Action中设置数据:

  1. @Override
  2. public String execute() throws Exception {
  3. ActionContext actionContext = ActionContext.getContext();
  4. ValueStack valueStack = actionContext.getValueStack();
  5. valueStack.set("name", "baozi(ValueStack)");
  6. valueStack.set("age", 24);
  7. return SUCCESS;
  8. }

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中设置数据:

  1. package com.java1234.action;
  2. import java.util.Map;
  3. import com.opensymphony.xwork2.Action;
  4. import com.opensymphony.xwork2.ActionContext;
  5.  
  6. public class HelloAction2 implements Action {
  7.  
  8. @Override
  9. public String execute() throws Exception {
  10. ActionContext actionContext = ActionContext.getContext();
  11.  
  12. // 在Action中设置session值
  13. Map<String, Object> session = actionContext.getSession();
  14. session.put("name", "张三(Session)");
  15. session.put("age", 17);
  16.  
  17. // 在Action中设置application值
  18. Map<String, Object> application = actionContext.getApplication();
  19. application.put("name", "李四(application)");
  20. application.put("age", 24);
  21. return SUCCESS;
  22. }
  23.  
  24. }

在struts.xml中配置映射关系:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <package name="helloWorld" extends="struts-default">
  7. <action name="hello" class="com.java1234.action.HelloAction2">
  8. <result name="success">success2.jsp</result>
  9. </action>
  10. </package>
  11. </struts>

在展示界面取出值栈中的数据:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@taglib prefix="s" uri="/struts-tags" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. <%
  10. request.setAttribute("name", "BaoZi(parameters)");
  11. request.setAttribute("age", 11);
  12. %>
  13. </head>
  14. <body>
  15. 请求参数中的数据:<s:property value="#parameters.name"/><br/>
  16. <s:property value="#parameters.age"/><hr/>
  17. 请求作用域中的数据:<s:property value="#request.name"/><br/>
  18. <s:property value="#request.age"/><hr/>
  19. session作用域中的数据:<s:property value="#session.name"/><br/>
  20. <s:property value="#session.age"/><hr/>
  21. application作用域中的数据:<s:property value="#application.name"/><br/>
  22. <s:property value="#application.age"/><br/>
  23. </body>
  24. </html>

访问地址:localhost:8080/HeadFirstStruts2Chap01/hello?name=HeiHei&age=15

5、OGNL访问复杂对象

5.1、访问javaBean对象

5.2、访问集合对象

5.3、访问Map对象

Student对象:

  1. package com.java1234.model;
  2.  
  3. public class Student {
  4. private String name;
  5. private int age;
  6. public Student() {
  7. super();
  8. // TODO Auto-generated constructor stub
  9. }
  10. public Student(String name, int age) {
  11. super();
  12. this.name = name;
  13. this.age = age;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getAge() {
  22. return age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27.  
  28. }

在Action中设置数据:

  1. package com.java1234.action;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import com.java1234.model.Student;
  8. import com.opensymphony.xwork2.Action;
  9.  
  10. public class HelloAction3 implements Action {
  11.  
  12. //定义一个JavaBean对象的引用变量:
  13. private Student student;
  14. //定义一个List<Student>对象的引用变量:
  15. private List<Student> students;
  16. //定义一个Map<String, Student>对象的引用变量:
  17. private Map<String, Student> studentMap;
  18.  
  19. public Map<String, Student> getStudentMap() {
  20. return studentMap;
  21. }
  22. public void setStudentMap(Map<String, Student> studentMap) {
  23. this.studentMap = studentMap;
  24. }
  25. public List<Student> getStudents() {
  26. return students;
  27. }
  28. public void setStudents(List<Student> students) {
  29. this.students = students;
  30. }
  31. public Student getStudent() {
  32. return student;
  33. }
  34. public void setStudent(Student student) {
  35. this.student = student;
  36. }
  37.  
  38. @Override
  39. public String execute() throws Exception {
  40. //在action中给javaBean对象设置值
  41. student = new Student("xiaohong", 10);
  42.  
  43. //在action中给list集合设置值
  44. students = new ArrayList<Student>();
  45. students.add(new Student("xiaoqing", 17));
  46. students.add(new Student("xiaohua", 16));
  47.  
  48. //在action中给Map对象设置值
  49. studentMap = new HashMap<String, Student>();
  50. studentMap.put("boy", new Student("jianguo", 5));
  51. studentMap.put("girl", new Student("xiaoxiang", 4));
  52. return SUCCESS;
  53. }
  54.  
  55. }

在struts.xml中配置映射关系:同上边OGNL访问ActionContext数据的操作使得配置文件一样

在展示界面取出值栈中的数据:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@taglib prefix="s" uri="/struts-tags" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. OGNL访问javaBean对象:
  12. <s:property value="student.name"/>&nbsp;&nbsp;&nbsp;
  13. <s:property value="student.age"/><hr/>
  14. OGNL访问List集合对象:
  15. <s:property value="students[0].name"/>&nbsp;&nbsp;&nbsp;
  16. <s:property value="students[0].age"/><br/>
  17. <s:property value="students[1].name"/>&nbsp;&nbsp;&nbsp;
  18. <s:property value="students[1].age"/><hr/>
  19. OGNL访问Map集合对象:
  20. <s:property value="studentMap['boy'].name"/>&nbsp;&nbsp;&nbsp;
  21. <s:property value="studentMap['boy'].age"/><br/>
  22. <s:property value="studentMap['girl'].name"/>&nbsp;&nbsp;&nbsp;
  23. <s:property value="studentMap['girl'].age"/><hr/>
  24. </body>
  25. </html>

访问地址:localhost:8080/HeadFirstStruts2Chap01/hello

6、OGNL访问静态属性和方法

创建一个包含静态属性和静态方法的类:MyStatic

  1. package com.java1234.common;
  2.  
  3. public class MyStatic {
  4.  
  5. public static final String str = "OGNL访问静态属性!";
  6.  
  7. public static String print() {
  8. return "OGNL访问静态方法!";
  9. }
  10. }

在配置文件中开启允许静态方法执行:

  1. <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

在ognl_static.jsp页面展示:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@taglib prefix="s" uri="/struts-tags" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. OGNL访问静态属性:
  12. <s:property value="@com.java1234.common.MyStatic@str"/><hr/>
  13. OGNL访问静态方法:
  14. <s:property value="@com.java1234.common.MyStatic@print()"/>
  15. </body>
  16. </html>

学习Struts--Chap05:值栈和OGNL的更多相关文章

  1. 关于Struts2中的值栈与OGNL表达式

    1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. ...

  2. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  3. Struts2学习记录-Value Stack(值栈)和OGNL表达式

    仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...

  4. Struts2基础学习(七)—值栈和OGNL

    目录: 一.值栈 二.OGNL表达式 一.值栈(ValueStack) 1.定义      ValueStack贯穿整个Acton的生命周期,每个Action类的对象实例都拥有一个ValueStack ...

  5. Struts(九):值栈(OGNL)

    引言 在我们开发过程中,往往会使用一个对像传递到一个具体的action中,之后到跳转页面中访问对应对象的具体的参数. 比如:我们搭建一个struts2项目: 回顾下如何搭建strut2: 1.下载的s ...

  6. (四)值栈与OGNL

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:值栈简介 值栈是对应每个请求对象的一套内存数据的封装,Struts2 会 ...

  7. 值栈和OGNL 之 7.1 值栈

    7.1  值栈 7.1.1  值栈是什么 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Resu ...

  8. 值栈与ognl

    ValueStack (值栈): 1.贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个ValueStack对象).相当于一个数据的中转站.在其中保存当前Action对象和其他相关 ...

  9. struts框架值栈问题二之值栈的内部结构

    2. 问题二 : 值栈的内部结构 ? * 值栈由两部分组成 > root -- Struts把动作和相关对象压入 ObjectStack 中--List > context -- Stru ...

随机推荐

  1. 微信jssdk分享功能开发

    先理解下分享: 在app端 ,经常能看见 分享按钮的功能,(分享给朋友,分享到朋友圈,分享到QQ空间等等): https://open.weixin.qq.com/(微信开发平台),这需要到开放平台注 ...

  2. MYSQL数据仓库infobright【备忘】

    Infobright是一个基于MySQL开发的开源数据仓库(Data Warehouse)软件,可作为MySQL的一个存储引擎来使用,SELECT查询与普通MySQL无区别. 优点:查询性能高:百万. ...

  3. Centos7X部署Zabbix监控

    一:yum安装LAMP环境 zabbix-server端防火墙配置(可以选择iptables -F清空) iptables -A INPUT -m state --state NEW -m tcp - ...

  4. nginx-fastcgi 反向代理

    Nginx处理php页面 用fpm-server  基于fastcgi模块实现 Ngx_http_proxy_module  只能反代后端http server的主机 Ngx_fastcgi_prox ...

  5. Codeforces 436E Cardboard Box (看题解)

    Cardboard Box 贪了个半天贪不对, 我发现我根本就不会贪心. 我们先按b排序, 然后枚举选两颗心的b的最大值, 在这个之前的肯定都要选一个, 因为前面的要是一个都没选的话, 你可以把当前选 ...

  6. Python 事件驱动与异步IO

    一.事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来出发相应的处理.另外两种常见的编程范式是(单线程)同步以及多线程编程. 1. ...

  7. List接口相对于Collection接口的特有方法

    [添加功能] 1 void add(int index,Object element); // 在指定位置添加一个元素. [获取功能] 1 Object get(int index); // 获取指定 ...

  8. 利用Flume将MySQL表数据准实时抽取到HDFS

    转自:http://blog.csdn.net/wzy0623/article/details/73650053 一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取 ...

  9. 07. Matplotlib 3 |表格样式| 显示控制

    1.表格样式创建 表格视觉样式:Dataframe.style → 返回pandas.Styler对象的属性,具有格式化和显示Dataframe的有用方法 样式创建:① Styler.applymap ...

  10. Python交互图表可视化Bokeh:7. 工具栏

    ToolBar工具栏设置 ① 位置设置② 移动.放大缩小.存储.刷新③ 选择④ 提示框.十字线 1. 位置设置 import numpy as np import pandas as pd impor ...