一 什么是值栈

值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值.

  每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在一个值栈对象

  值栈对象的声明周期与Action的生命周期(第一次访问action的时候被创建, 当action中方法返回值时被销毁)一致.

二 Action中值栈对象的获取方法

  每个action只对应一个值栈对象. 值栈对象可以通过ActionContext对象中的方法获取.

  ActionContext context = ActionContext.getContext();

      ValueStack valueStack = context.getValueStack();

三 值栈的结构

  值栈内部主要由两部分构成: root和context;

  root --> compoundroot extends ArrayList --> root是由list集合构成的

  context --> ognlcontext implements Map --> context是由map集合构成的

可以通过ognl表达式中的<s:debug>标签查看值栈的内部结构

  在值栈中, 操作的数据一般是root数据(默认的在action中没有任何操作时, root栈顶元素就是action的引用). 而context中主要存放的是一些对象的引用.

  OgnlContext的主要结构为:request, session,
application, parameters, attr, 他们对应的值分别是:request对象的引用, HttpSession的引用, ServletContext对象的引用, 请求参数(action后面的请求参数),
获取域对象.

四 值栈中存放数据

4.1 通过值栈对象中的set方法

  //1.通过值栈中的set方法,往值栈的root中存值

        ActionContext context =
ActionContext.getContext();

        ValueStack stack =
context.getValueStack();

        stack.set("key",
"value");

  

4.2 通过值栈对象中的put方法存值

  //2.通过值栈中的push方法,往栈顶添加值

        stack.push("TopstackElement");

  

4.3 在action中定义成员变量并生成相应的set方法

1> 值栈中存放基本数据类型

package com.rodge.stack;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.util.ValueStack;



public class SaveValueStack extends ActionSupport {

    //设置序列化版本号

    private static final long serialVersionUID = 1L;

    private String username = "";

    public String getUsername() {

        return username;

    }

    @Override

    public String execute() throws Exception
{     

        //3.通过成员变量+get方法,设置值栈中的值,不用单独分配内存空间

        username = "stackValue";

        return "save";

    }

}



2> 值栈中存放对象

package com.rodge.stack;

import com.opensymphony.xwork2.ActionSupport;

public class SaveObjectInStack extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private User user = new User();

    public User getUser() {

        return user;

    }

    @Override

    public String execute() throws Exception {

        user.setUsername("小新");

        user.setAddress("Japen");

        user.setDesc("6毛");

        return "save";

    }  

}

3> 将集合存放在值栈中

package com.rodge.stack;

import java.util.ArrayList;

import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

public class ListStackAction extends ActionSupport {

 static final long serialVersionUID = 1L;

    private List<User> list = new ArrayList<User>();

    public List<User> getList() {

        return list;

    }

    @Override

    public String execute() throws Exception {

        User user1 = new User();

        user1.setUsername("小明");

        user1.setAddress("北京");

        user1.setDesc("教师外面");

User user2 = new User();

        user2.setUsername("小王");

        user2.setAddress("隔壁");

        user2.setDesc("小王叔叔");

list.add(user1);

        list.add(user2);

        return "list";

    }

}

五 在jsp页面中获取值栈数据

  使用struts2标签和ognl表达式获取值栈数据

  <%@ taglib uri="/struts-tags" prefix="s" %>

5.1 获取值栈中的字符串数据

<s:property value="username" />

5.2 获取值栈中存放的对象数据

  <s:property value="user.username" />

    <s:property value="user.address" />

    <s:property value="user.desc" />

5.3 获取值栈中存放的list集合

<!-- 第一种获取list集合的方法 -->

    <s:property value="list[0].username" />

    <s:property value="list[0].address" />

    <s:property value="list[0].desc" />

    <hr/>

    <!-- 第二种获取list集合中数据的方法 -->

    <s:iterator value="list">

        <s:property value="username"
/>

        ----

        <s:property value="address"
/>

        ----

        <s:property value="desc"
/>

        <br/>

    </s:iterator>

    <hr/>

<!-- 第三种获取list集合中数据的方法 -->

    <s:iterator value="list"
var="user">

        <s:property value="#user.username" />

        --------

        <s:property value="#user.address" />

        --------

        <s:property value="#user.desc" />

        <br/>

    </s:iterator>

5.4 值栈中获取其他数据

1> 获取始终值栈对象的set方法存放在值栈中的数据stack.set("key", "value");

<s:property value="key" />

2>使用值栈对象里面的push方法把数据放到值栈里面

<!-- 获取push方法存放到值栈中的数据 -->

    获取push方法存放到值栈中的数据:

    <s:property value="[0].top" />

3> 位什么EL表达式可以获取值栈中的数据

  EL表达式并不是直接获取值栈中的数据. 是因为struts2中增强了reqeust总的getAttribute方法, 增强的getAttribute方法首先会在request域中寻找是否有值, 如果request域中有, 则直接返回; 如果域对象里面如果没有值,得到值栈对象,从值栈对象里面把值获取到,最后放到域对象里面.

六 Ognl中#和%的使用

1
 #
: 获取context里面的数据

2 
%
:  的使用

(1)使用struts2的表单标签,显示值,使用ognl表达式

写ognl作为字符串显示出来,没有作为ognl表达式执行

(2)使用%让表单标签里面值作为ognl执行

Struts2中的值栈的更多相关文章

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

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

  2. struts2中各种值栈问题

    struts2中OGNL和 ValueStack(一) 收藏 学习的时候,总分不清楚在struts2中页面的传值和取值是怎么来完成的,所以从网上搜了很多资料,现在把这些资料总结写,留着以后参考..看完 ...

  3. Struts2 中的值栈的理解

    通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...

  4. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  5. Java中的值栈

    OGNL表示式使用 和 值栈 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的表达式 ...

  6. Struts2 框架的值栈

    1. OGNL 表达式 1.1 概述 OGNL(Object Graphic Navigation Language),即对象图导航语言; 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个 ...

  7. struts2 ValueStack(值栈)解析

    Struts2一个重要点就是值栈. ValueStack,是用来存储一些在各个action,或者说是通过s标签.el表达式等给前台Jsp等页面展示的东西. ValueStack是一个接口,其内部接口非 ...

  8. Struts2笔记_值栈

    A.值栈概述 值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西.struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区 ...

  9. struts2学习(7)值栈简介与OGNL引入

    一.值栈简介: 二.OGNL引入: com.cy.action.HelloAction.java: package com.cy.action; import java.util.Map; impor ...

随机推荐

  1. Android表格布局(Table Layout)

    Android表格布局(Table Layout) 先来看布局管理器之间继承关系图: 图1 可知TableLayout继承了LinearLayout,所以表格布局本质上依然是线性管理器. 表格布局采用 ...

  2. 《java入门第一季》之面向对象(继承总结)

    继承已经全部写完了,接下来通过几个案例对继承问题做一个总结: /* 看程序写结果: A:成员变量 就近原则 B:this和super的问题 this访问本类的成员 super访问父类的成员 C:子类构 ...

  3. 网站开发进阶(二十二)HTML UI知识汇总(更新中...)

    HTML知识汇总(更新中...) 1.<iframe> 标签 浏览器支持 所有浏览器都支持 <iframe> 标签. 定义和用法 iframe 元素会创建包含另外一个文档的内联 ...

  4. Erlang cowboy 入门参考

    Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...

  5. Android 高逼格纯代码实现类似微信钱包带分割线的GridView

    前言    原文地址:http://blog.csdn.net/sk719887916/article/details/40348837: Tamic 通过上两篇关于自定view的文章,在自定义vie ...

  6. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  7. 如何设置静态IP

    首先在CMD命令行ipconfig查看临时分配的IP地址: 然后打开我的"网络"--->"本地连接"--->IPv4--->属性 电信DNS劫 ...

  8. 关于Html5发展和应用前景

    现在的HTML5就像当年崭露头角时的Ajax,有人在做,但不知道叫它什么.最近,苹果在 HTML5上大做文章,而著名的Web设计师Eric Meyer则提出了Web Stacks的概念.Alex Ke ...

  9. C# 设置Word文档保护(加密、解密、权限设置)

    对于一些重要的word文档,出于防止资料被他人查看,或者防止文档被修改的目的,我们在选择文档保护时可以选择文档打开添加密码或者设置文档操作权限等,在下面的文章中将介绍如何使用类库Free Spire. ...

  10. OC实现带弹跳动画按钮的界面控制器view

    很多应用都有带弹跳动画发布界面,这里用一个 UIViewController 实现这种效果,外界只要 modal出不带动画这个控制器就可以实现 #import "BSPublishVC.h& ...