值棧簡介一

簡介

值棧主要解決從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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章