编程爱好者联盟 2016-11-28
ValueStack翻译过叫做值栈,顾名思义就是存储值的栈 Struts在每次处理请求都会创建一个新的ValueStack用来存储这个请求过程中所要用到的属性及对象。 像我们熟悉ActionContext就是值栈的一部分。 /**
* A Stack that is implemented using a List.
*
* @author plightbo
* @version $Revision$
*/
public class CompoundRoot extends CopyOnWriteArrayList<Object> {
private static final long serialVersionUID = 8563229069192473995L;
public CompoundRoot() {
}
public CompoundRoot(List<?> list) {
super(list);
}
public CompoundRoot cutStack(int index) {
return new CompoundRoot(subList(index, size()));
}
public Object peek() {
return get(0);
}
public Object pop() {
return remove(0);
}
public void push(Object o) {
add(0, o);
}
} //改变对象栈,栈顶的对象
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
valueStack.push(User.builder().username("猪八戒").address("高老庄").build()); <!-- 可以直接获取栈顶对象的属性,如果栈顶对象没有就会继续往下找,再没有就从Map栈中找 --> 用户名 : <s:property value="user.username"></s:property> <br /> <br /> 年龄 : <s:property value="age"></s:property> <br /> <br /> 地址 : <s:property value="address"></s:property> <br /> <br /> <hr> <!-- 对于被我们改变的栈顶对象,我们可以用下标的方式 --> 用户名 : <s:property value="[1].username"></s:property> <br /> <br /> 地址 : <s:property value="[1].address"></s:property> <br /> <br /> <hr> <!-- 另外两种方式 object['filedName'] 或者 object["filedName"] --> 用户名 : <s:property value="[1]['username']"></s:property> <br /> <br /> 地址 : <s:property value="[1]['address']"></s:property> <br /> <br />
<%
session.setAttribute("hello", "你好");
application.setAttribute("key", "appKey");
session.setAttribute("key", "sessKey");
request.setAttribute("key", "reqKey");
%>
<hr><br><br>
<!-- Map栈中Session数据 -->
获取到Session域中属性: <s:property value="#session.hello"></s:property><br><br>
获取请求参数: <s:property value="#parameters.username"></s:property><br><br>
<!-- attr 会从小到大的范围去查找 -->
通过attr获取属性值:<s:property value="#attr.key"/> <!-- 开启静态方法访问 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<!-- 调用静态方法和字段 -->
调用静态字段: <s:property value="@java.util.Calendar@WEEK_OF_YEAR"></s:property><br>
<!-- 对于调用静态方法,我们需要去 struts.xml 文件中配置-->
调用静态方法: <s:property value="@org.pan.struts2.entity.User@sayHello('张三丰')"></s:property> <!-- 调用栈顶对象的 公共方法和属性(属性就是我们之前访问的字段值) -->
调用公共方法: <s:property value="sayYou('巨无霸')"></s:property> <!-- OGNL 访问数组类型的属性 -->
<%
String[] names = new String[]{"aa","bb","cc","dd"};
request.setAttribute("names", names);
%>
length:<s:property value="#attr.names.length"/>
<br/>
names[1]:<s:property value="#attr.names[1]"/> <%
List<String> colors = new ArrayList<String>();
colors.add("Red");
colors.add("Black");
colors.add("Green");
request.setAttribute("colors", colors);
%>
isEmpty: <s:property value="#request.colors.isEmpty()"></s:property><br><br>
size: <s:property value="#request.colors.size"></s:property><br><br>
colors: <s:property value="#request.colors[1]"></s:property> <!-- OGNL 访问Map类型属性 -->
<%
Map<String,String> letters = new HashMap<String,String>();
letters.put("AA", "aa");
letters.put("BB", "bb");
letters.put("CC", "cc");
request.setAttribute("letters", letters);
%>
isEmpty: <s:property value="#request.letters.isEmpty"></s:property><br><br>
size:<s:property value="#attr.letters.size()"/><br><br/>
AA:<s:property value="#attr.letters['AA']"/><br><br>
创建Map: <s:set var="testMap" value="#{'AA':'aa', 'BB':'bb', 'CC':'cc'}"></s:set><br><br>
读取创建的Map: <s:property value="#attr.testMap.AA"></s:property>