简介
值栈主要解决从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")