簡介
值棧主要解決從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")