ognl:值栈

1.值栈 ValueStack

1.1:值栈是干什么的?
存数据的,用在struts2里
相当于servlet中的域对象(page,request,session,application)

1.2:值栈存储位置:(每个对象中)
(1)每次访问action时,都会创建action对象(ActionContext一次请求创建一次)
(2)在每个action对象里面都会有一个值栈对象。(也就是说实例化一个action对象,就会配一个值栈,没有第二个哦)
(3)值栈取值从上往下,取到为止,如果已经拿到,不再往下找。
图解:
在这里插入图片描述
结果:name=小明 salary=2000

1.3:获取值栈对象的方法

ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();  //获得值栈

1.4:值栈内部结构
栈的特点:先进后出
将后来的数据压在前来的数据上叫:压栈
栈最上面的叫:栈顶

内部结构分两部分:
第一部分:root,结构是list集合
一般都是操作root结构。
第二部分:context,结构是map集合

1.5:案例一
1.5.1:Action类

public class Demo7 {
/**
  * 
  * 值栈的使用
  * 
  */
  public static void main1(String[] args) {
	  // 栈:表示一个先进后出的数据结构
	  ActionContext ac = ActionContext.getContext();
	  System.out.println(ac);
	  //获得值栈的时候就已经有内容了  不是action内部创建的
  
	  /**
	   * 为什么要使用ValueStack作为根对象
	        放到值栈中的对象都可视为根对象
	   */
	  ValueStack vs = ac.getValueStack();  //获得值栈
	  // push方法把项压入栈顶
	  vs.push(new Employee("zs", 22));
	  vs.push(new Employee("ls", 22));
	  vs.push(new Employee("ww", 22));

	  // pop方法移除栈顶对象并作为此函数的值返回该对象
	  Employee e = (Employee) vs.pop();
	  System.out.println(e.getName());
	  e = (Employee) vs.pop();
	  System.out.println(e.getName());
	  e = (Employee) vs.pop();
	  System.out.println(e.getName());
  
	  //输出:ww ls zs
}


	/**
	  * 此例用于模拟struts2的值栈计算过程
	  * 
	  * @param args
	  */
  public static void main2(String[] args) {
	  ActionContext ac = ActionContext.getContext();
	  ValueStack vs = ac.getValueStack();
	  vs.push(new Employee("张雇员", 2000));// 1
	  vs.push(new Student("小明同学", "s001"));// 0
	  System.out.println(vs.findValue("name"));
	  System.out.println(vs.findValue("salary"));
	  //小明同学    2000
	  //值栈取值从上往下,取到为止,如果已经拿到,不再往下找。
  }
  public String execute() {
	  main1(null);
	  System.out.println("------------------");
	  main2(null);
	  return "success";
 }

1.5.2:xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
 "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 
namespace:在内存中划分具体的控件
name:给package包取个名字
 -->
 <package name="sy" extends="base" namespace="/sy">
	 <action name="demo7Action" class="com.crud.two.web.Demo7">
	   <result name="success">/success.jsp</result>
	  </action>
 </package>
</struts>

1.5.3:dome1跳转页面

<h1>ognl简介</h1>
<a href="${pageContext.request.contextPath}/sy/demo7Action.action">测试6</a>

1.5.4:结果
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdn.net/20181012104406168?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTczNDc1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值