值栈简介一

简介

值栈主要解决从struts中将值返回给前端页面的问题,再从前端页面将值
取出,显示出来,值栈分为root栈和map栈,从root栈中取值时不用"#"号,从map
栈中取值,则需要"#"

root栈

root栈,本身相当于arrayList,将值存进去相当于压栈,将值取出来相当于出栈,
遵循栈的先进后出原则,后端得到root栈有两种方式
得到root栈-方式一
ValueStack val1 =  (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
通过struts.valueStack属性作为参数值,得到ValueStack,此方法不常用
得到root栈-方式二
ValueStack val2 = ActionContext.getContext().getValueStack();
此方法较为常用,其底层实现仍然依赖于方式一
两种方式比较
public class Demo01Action extends ActionSupport{

    @Override
    public String execute() throws Exception {
        ValueStack val1 =  (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
        ValueStack val2 = ActionContext.getContext().getValueStack();
        System.out.println(val1 == val2);
        System.out.println(val1.hashCode());
        System.out.println(val2.hashCode());
        return NONE;
    }
}
小结
此两种得到valueStack,即root栈的结果完全相同,第二种更常用,每一次请求
都将新建一个root栈
第一次访问结果

这里写图片描述

第二次访问结果

这里写图片描述

往root栈中存值的两种方式
方式一
public class Demo03Action extends ActionSupport{

    @Override
    public String execute() throws Exception {
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        valueStack.push("刘德华");
        valueStack.push("刘亦菲");
        valueStack.push("刘益德");
        return SUCCESS;
    }
}



<struts>
    <package name="struts" extends="struts-default" namespace="/">
        <action name="value2" class="com.lanou3g.Demo03Action">
            <result>/result.jsp</result>
        </action>
    </package>
</struts>

result.jsp  注意这里要引入标签库

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:property value="top" /><br />
    <s:property value="[1].top" /> <br />
    <s:property value="[2].top" /> <br />
</body>
</html>

从结果可看出遵循先进后出原则

这里写图片描述

方式二
public String execute() throws Exception {
    ValueStack valueStack = ActionContext.getContext().getValueStack();
    valueStack.set("name", "玄德");
    valueStack.set("name1", "关羽");
    valueStack.set("name2", "张飞");
    return SUCCESS;
}

<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:property value="name" /><br />
    <s:property value="name1" /> <br />
    <s:property value="name2" /> <br />
</body>

这里写图片描述

map栈

@Override
public String execute() throws Exception {
    ActionContext.getContext().put("name1", "马腾");
    ActionContext.getContext().put("name2", "马超");
    ActionContext.getContext().put("name3", "马铁");
    return SUCCESS;
}

<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:property value="#name1" /><br />
    <s:property value="#name2" /> <br />
    <s:property value="#name3" /> <br />
</body>

这里写图片描述

用property  value取值时 ,如果不加#号,会先到root栈中寻找,如果没找到,会再到
map栈中寻找

后端代码从root栈中取值
ActionContext.getContext().getValueStack().findString("username");
后端代码从map栈中取值
ActionContext.getContext().getValueStack().findString("#username");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值