Struts2–ValueStack(值栈)
简介
- 1.ValueStack实际上就是一个容器,实现一个接口,实现类为ognlValueStack
- 2.是所有数据的一个汇总
- 3.struts框架中的数据都保存在valueStack中,不存放到域当中(其实域当中的数据也存放在值栈当中的非根区)
- 4.valueStack贯穿整个actoin的生命周期,action一旦创建就会创建一个valueStack对象
- 5.将数据存放到值栈当中的好处是任何地方均可以去除其中的数据
值栈方法示例
-
1.创建struts2升级新方法
- 1).复制lib目录(jar包)WEB-INF中
- 2).复制resource文件到工程目录之下,并Make as…---->Resource root
- 3).配置前端的控制器
-
创建前端jsp 向后端发送数据(传参数)
<a href="hello.action?name=T恤&price=888.0">aaa</a>
-
2.创建domain实体类,接收参数(这样才能够将接收到的参数封装成对象)
-
3.创建Action
public class HelloAction extends ActionSupport implements ModelDriven<Goods>{ //实现接口中的方法和execute方法 }
-
4.配置strtus.xml
向valueStack值栈中存放数据
-
向根区中存放数据
public class HelloAction extends ActionSupport implements ModelDriven<Goods> { private Goods goods = new Goods(); @Override public Goods getModel() { return goods; } public String execute(){ //获取值栈 /** * 值栈分为根区和非根区(root和context) * 根区:存放当前action相关数据都存放到根区 * 非根区:存放一些整个程序的相关数据 相关域:req、session、application */ //获取完成之后就可以操作值栈(往域当中存放一些数据就可以直接存放到值栈当中) ValueStack valueStack = ActionContext.getContext().getValueStack(); //往值栈当中存放数据 -----------------------------根区 /*创建对象*/ Goods goods = new Goods(); goods.setName("鸡蛋"); goods.setPrice(12.3); /*入栈的操作 内部是一个栈结构*/ valueStack.getRoot().push(goods); /*把栈顶的元素出栈 出栈的为栈顶的元素(就会删除掉goods)*/ //valueStack.getRoot().pop(); //打印封装的参数 System.out.println(this.goods); return SUCCESS; }
-
向非根区中存放数据
public class HelloAction extends ActionSupport implements ModelDriven<Goods> { private Goods goods = new Goods(); @Override public Goods getModel() { return goods; } public String execute(){ //获取值栈 /** * 值栈分为根区和非根区(root和context) * 根区:存放当前action相关数据都存放到根区 * 非根区:存放一些整个程序的相关数据 相关域:req、session、application */ //获取完成之后就可以操作值栈(往域当中存放一些数据就可以直接存放到值栈当中) ValueStack valueStack = ActionContext.getContext().getValueStack(); //往域当中写入一些数据(域中对象存放在值栈当中) 往----------------------------非根区域中存数据 /*往req域中写入数据*/ ActionContext.getContext().put("reqName","reqValue"); /*往session域当中写入数据*/ ActionContext.getContext().getSession().put("sessionName","sessionValue"); /*往application域当中写入数据*/ ActionContext.getContext().getApplication().put("applicationName","applicationValue"); return SUCCESS; }
从valueStack(值栈中取出数据展示到jsp界面)
- 配置返回结果页(struts.xml中配置result)
- 在返回的结果页中获取debug信息
很重要:因为值栈中的信息全部都可在debug当中获得- 1).配置struts.xml(在package外面配置常量)
<constant name="struts.devMode" value="true" />
- 2).在jsp中引入Strtus中debug标签库
<%@ tiglib uri="struts-tag" prefix="c" %> 再在body界面的body中加入: <%c:debug></s:debug> 添加完成之后就可以在界面中看到debug,点击进入就能够看到所有值栈中的信息了
- 3).取值栈中的信息到jsp界面
<%--取根元素中的数据: value里面写的就是ognl表达式 根区中取数据只能取栈顶的元素(明确栈的结构) 直接按照字段(domain中的字段名)就可以取出值--%> <s:property value="name"/> <%--取非根元素 value里面是ognl表达式 根据key值取出里面的数据 注意一要在key值前面加上的#号--%> <%--req域中取数据--%> <s:property value="#reqName"/> <%--session域中取数据--%> <s:property value="#session.sessionName"/> <s:property value="#application.applicationName"/> <br> <%--在页面当中使用ognl 调用方法 普通的方法--%> <s:property value="'hello'.length()"/><br> <%--调用静态的方法 使用之前要配置一个常量--%> <%--配置方法为:在struts.xml中的package外添加<constant name="struts.ognl.allowStaticMethodAccess" value="true" />即可--%> <s:property value="@java.lang.Math@random()"/>
- 1).配置struts.xml(在package外面配置常量)