编程爱好者联盟 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>