struts2笔记3

struts2数据存储通过值栈方式,数据获取ognl+struts2标签

1.值栈valueStack

ValueStack值栈是struts2提供接口规范,也提供了一个接口实现OgnlValueStack

  • Action的生命周期:
    创建:每次访问都创建Action
    销毁:响应结束Action销毁
  • 值栈的生命周期:(类似与request) (重点)
    值栈生命周期与Action同步

2.值栈对象何时创建?ValueStack 和 ActionContext是什么关系

  • 每次访问都会创建值栈对象
  • ActionContext是Action的上下文对象,该对象内部维护着值栈对象的引用

3.获取值栈的方式

  • 通过ACtionContext获得值栈对象(重点):
    ActionContext actionContext = ActionContext.getContext();
    ValueStack valueStack=actionContext.getValueStack();

  • 通过request域对象获得值栈对象(了解):
    ValueStack valueStack = (ValueStack)request.getAttribute(“struts.valueStack”);

4.手动向值栈存值

  • 向Root栈存储数据
       //获得Root栈
        ActionContext context = ActionContext.getContext();
        ValueStack valueStack = context.getValueStack();
        CompoundRoot root = valueStack.getRoot();

        //压栈
        root.push("xxxx"); //压到list的头部  add(0, "xxxx");
        //取值栈顶的信息  (list的头部  角标为0位置)
        Object peek = root.peek();  //return get(0);

        //弹栈
        Object pop = root.pop(); //return remove(0);

2.向context栈存储数据

        //获得context栈
        ActionContext context = ActionContext.getContext();
        ValueStack valueStack = context.getValueStack();
        //获得值栈内部的contextMap<String, Object> map = valueStack.getContext();
        //存储数据
        map.put("aaa", "AAA");

valueStack对象直接操作值栈的API(重点)

//都是存储到root栈的api
valueStack.push()
valueStack.set()        
//获取值,从栈顶以此匹配map的key或者对象的属性名 只要匹配成功 就不在向下匹配 返回匹配成功的值
valueStack.findValue(key/propertyName);

5.struts2框架会将哪些数据自动保存到值栈中(重点)

struts2标签<s:debug>可以在页面中查询值栈的全部内容

  • 自动将哪些数据存储到root栈
    将当前访问的Action对象自动压栈
    将当前模型对象自动压栈
    目的:方便页面上使用ognl表达式取值 根据propertyName/key取值
  • 自动将那些数据存储到context栈(了解)
    request对象
    response对象
    session域
    application域
    ….

6. 如何取值栈的数据 (Ognl+struts2标签)(重点)

  • 取出普通数据
        <s:property value="ognl表达式"/>

        <h1>取出模型对象的name</h1>
        <s:property value="name"/>

        <h1>取出user实体的name</h1>
        <s:property value="user.name"/>

        <h1>取出集合userList中的name</h1>
        <s:property value="userList[0].name"/>
  • 取出集合数据(遍历)
该标签自动将集合中的每一个元素临时在Root栈顶存储一份
        <s:iterator value="userList">
            <s:property value="name"/> == <s:property value="age"/> <br/>
        </s:iterator>

        <h1>遍历userList 方法1</h1>
        <s:iterator value="userList">
            <s:property value="name"/> == <s:property value="age"/> <br/>
        </s:iterator>

        <h1>遍历userList 方法2  临时的变量名称var</h1>
        <!-- 将集合中的元素以指定的名称(var指定的变量名称) 在context存储一份-->
        <s:iterator value="userList" var="user">
            <!-- #代表从context栈取值 -->
            <s:property value="#user.name"/> ==<s:property value="#user.age"/>  <br/>
        </s:iterator>
  • s:if标签
        <h1>if判断</h1>
        <s:if test="num>5">
            大于5
        </s:if>
        <s:elseif test="num==5">
            等于5
        </s:elseif>
        <s:else>
            小于5
        </s:else>

7.EL也能访问值栈中的数据原因

${}取值 底层从域中取值 调用request.getAttribute();
原因:request对象的getAttribute()方法被增强

猜你喜欢

转载自blog.csdn.net/sinat_29211659/article/details/81233850