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

一、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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值