struts2学习笔记 -- day07 OGNL上下文

xiaoxiao2021-02-28  141

一、ContextMap

1、概述

它是OGNL上下文对象,是struts2中封装数据最大的对象。我们一次请求中所有用到的信息都可以在它里面找到。它是一个Map结构的对象,其中key是字符串,value是一个Object。

2、ContextMap中封装的数据

(1)、contextMap中的全部对象

(2)、ContextMap的结构

二、ActionContext

1、什么是ActionContext

它是一个工具类,是struts2框架提供给我们的,可以让我们调用其中的方法,快速的操作ContextMap。用它操作OGNL上下文对象,比直接操作ContextMap要方便很多。

2、ActonContext和ContextMap的关系

ActionContext就相当于对ContextMap进行了一次再封装。

3、ActionContext什么时候创建

由于ActionContext是操作的ContextMap,而ContextMap中封了我们一次请求的所有数据,所以它的创建应该是每次请求访问Action时,即核心控制器(StrutsPrepareAndExecuteFilter)的doFilter方法执行时

三、ContextMap中数据的存取

1、向ContextMap域中存取数据

(1)、动作类存值

public String value(){ ActionContext context = ActionContext.getContext();//从当前线程上获取context context.put("contextMap", "向ContextMap中存放数据"); return "success"; }

(2)、jsp页面 debug视图 中的数据

<body> <s:debug /> </body>

注意:contextMap中后添加的数据会覆盖之前添加的数据

public String value(){ ActionContext context = ActionContext.getContext(); Map<String, Object> contextMap = context.getContextMap(); contextMap.put("contextMap", "111"); context.put("contextMap", "第一次"); return "success"; }

页面debug中显示的contextMap中的数据只有"第一次"

(3)、jsp页面取值

获取contextMap域中的数据

<%--1、获取ContextMap中的数据(大Map和小Map) 使用的是OGNL表达式。借助的是struts2的s:property标签 取Map中的数据: 需要使用#key的方式 --%> <s:property value="#contextMap"/>

2、向ContextMap中key为applicationContext的小map中存取数据

(1)、动作类中

public String value(){ ActionContext context = ActionContext.getContext();//从当前线程上获取context //获取application Map<String, Object> application = context.getApplication(); //向application域中存值 application.put("application存值", "向application域中存值"); return "success"; }

(2)、jsp中debug

(3)、获取大Map中key为application的小Map中的数据

注意:不要直接获取application域的数据,因为application域中数据太多

<%--3、获取大Map中key为application的小map数据 --%> <s:property value="#application.applicationMap"/><br/> <s:property value="#application.application存值"/><br/> <s:property value="#application.application存值.split(' ')"/>

3、向key为session的小map中存取数据

(1)、动作类

public String value(){ ActionContext context = ActionContext.getContext();//从当前线程上获取context //获取session Map<String, Object> session = context.getSession(); //存值 session.put("session存值", "向小map--session中存值"); return "success"; }

(2)、jsp中debug

(3)、jsp取值

获取session域中的所有数据

<%-- 获取session的map中的所有数据 --%> <s:property value="#session"/>

获取session域中的key为 sessionMap、sessionAttr 的数据

<%--2、获取大Map中key为session的小Map中的数据 获取小map中key为sessionMap、sessionAttr的数据以及sessionAttr中字符串数据的长度 --%> <s:property value="#session.sessionMap"/><br/> <s:property value="#session.sessionAttr"/><br/> <s:property value="#session.sessionAttr.length()"/>

4、使用原生servletAPI对象存值

(1)、动作类

public String value(){ //使用原生ServletAPI获取对象 ServletContext application = ServletActionContext.getServletContext(); HttpSession session = ServletActionContext.getRequest().getSession(); //存入数据 application.setAttribute("原生application域对象", "向原生application域中存入数据"); session.setAttribute("原生session域对象", "向原生session域对象中存入数据"); return "success"; }

(2)、jsp中debug

四、ValueStack

1、什么是ValueStack

ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个 Action 的生命周期。

它是ContextMap中的一部分,里面的结构是一个List,是我们可以快速访问数据一个容器。它的封装是由struts2框架完成的。

ValueStack实现了栈的特性,即先进后出

2、ValueStack的内部结构

在 OnglValueStack 中包含了一个CompoundRoot的对象,该对象继承了ArrayList,并且提供了只能操作集合第一个元素的方法,所以我们说它实现了栈的特性。同时,它里面定义了一个ContextMap的引用,也就是说,我们有值栈对象,也可以通过值栈来获取ContextMap。

3、ValueStack的存值取值

(1)、动作类代码

public String value(){ //获取ActionContext ActionContext context = ActionContext.getContext(); //获取valueStack ValueStack valueStack = context.getValueStack(); //将数据存入valueStack中,即压栈 Student s = new Student(); s.setName("test"); s.setAge(18); valueStack.push(s); return "success"; }

(2)、jsp中debug内容

(3)、jsp页面取值

使用OGNL表达式获取值栈中的数据,借助的是s:property标签

<s:property value="name"/><br/> <s:property value="age"/>

注意:在动作类中push方法是压栈操作,后面push的对象会在栈顶,而action动作类中的成员属性会在栈底,具体信息如下图

取指定位置的值:

当<s:property>中没有指定name属性时,获取的是栈顶的第一个对象

当没有操作值栈的时候,默认的栈顶对象是当前执行的动作类

ognl表达式对应的对象及方法

使用的对象是:valuestack

使用的方法是:Object = vs.findValue(String  ognlExpression)

<body> <s:debug /> <s:property value="name" /> <br/> <!-- 以下是java代码findValue()方法输出的内容 --> <% ActionContext context = ActionContext.getContext(); //获取name的值 Object v1 = context.getValueStack().findValue("name"); out.print(v1); //获取指定位置的name Object v2 = context.getValueStack().findValue("[0].name"); out.print(v2); //获取session域中key为sessionMap的值 Object v3 = context.getValueStack().findValue("#session.sessionMap"); out.print(v2); %> </body>

转载请注明原文地址: https://www.6miu.com/read-20445.html

最新回复(0)