zoukankan      html  css  js  c++  java
  • struts2值栈分析

    前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易。

    struts2中利用值栈来存储数据,在struts2中,把数据存在值栈中,然后在jsp页面用ognl表达式取出。

    在struts2中的action有三种方法获取值栈

    ValueStack valueStack=ActionContext.getContext().getValueStack();
    ValueStack valueStack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
    ValueStack valueStack=ServletActionContext.getValueStack(ServletActionContext.getRequest());

    可以看到我们可以利用request来获取值栈,而request的生命周期为一次请求,所以值栈的生命周期也为一次请求。

    ValueStack 是一个接口,它的实现类是ognlvalueStack。

    在valueStack中有两个数据结构,一个名字为context,另一个为root。

    context的类型是OgnlContext,OnglContext实现了Map接口,所以context本质上是一个Map。

    valueStack中的另一个数据结构root,它的类型是CompoundRoot,CompoundRoot继承了ArrayList类,所以它本质上是一个ArrayList,我们称它为对象栈

    map栈中有一个名称为_values的对象,它是一个HashMap,在这里存放了request,response,session,application等servlet容器的内容,我们称它为map栈

    map栈中还有一个名称为_root的对象,它和我们上面说的valueStack中的另一个数据结构root相同,都是对象栈,为什么valueStack中会有两个对象栈呢,这是因为struts2继承了以前一些框架的内容导致的。

    对象栈中保存了两个对象,一个是ValueStackAction,它代表的是当前请求的Action,

    另一个是DefaultTextProvider,它是用于struts2国际化的。

    我手动用一个粗糙的涂鸦图解下:

    所以在jsp页面中,如果要输出的内容在对象栈中,直接指定属性名字,如果在map栈中,要用#来指定

    例如

    String name="aaa";
    String Bname="bbb";
    ActionContext.getContext().getValueStack().push(name);  //把字符串放入对象栈中
    ActionContext.getContext().put("Bname", Bname);    //把字符串放入map栈中
    

     在jsp页面中取出的对应的值:

    <s:property value="name"/>
    <s:property value="#Bname"/>

    有错误请指出

  • 相关阅读:
    Linux与Windows命令的比较
    操作系统的启动过程
    Spyder快捷键
    pytoch的最佳打开方式
    操作系统逻辑结构
    插值法
    bzoj3509[CodeChef]COUNTARI
    bzoj2969 矩形粉刷
    hdu5575 Discover Water Tank
    bzoj3473字符串&bzoj3277串
  • 原文地址:https://www.cnblogs.com/ChanSS/p/5515040.html
Copyright © 2011-2022 走看看