A:存数据
1.利用ActionContext存数据
![](https://images2015.cnblogs.com/blog/1090008/201701/1090008-20170112190407791-2085031053.png)
这种方式最简便
这是一个购物车案例
把查询来的数据放入到Session中存储起来
2.利用valuestack值栈存数据
![](https://images2015.cnblogs.com/blog/1090008/201701/1090008-20170112190528322-99352161.png)
把查询出来的数据放入到值栈中存储起来
总结
//获取ValueStack对象的引用 //第一种方式:获取HttpServletRequest对象,通过对象的getAttribute方法,从域中取 //1.获取request对象 HttpServletRequest request = ServletActionContext.getRequest(); //2.根据key获取ValueStack对象的引用 ValueStack vs1 = (ValueStack)request.getAttribute("struts.valueStack"); System.out.println(vs1.hashCode());
//第二种方式:先获取ActionContext对象,再取出requestMap,然后通过map的get方法获取 //1.获取ActionContext对象 ActionContext context = ActionContext.getContext(); //2.获取requestMap Map<String,Object> requestAttribute = (Map<String,Object>)context.get("request"); //3.根据key获取对象的引用 ValueStack vs2 = (ValueStack)requestAttribute.get("struts.valueStack"); System.out.println(vs2.hashCode()); //第三种方式:使用ActionContext对象的方法,直接获取ValueStack对象的引用 ValueStack vs3 = context.getValueStack(); System.out.println(vs3.hashCode()); //栈的操作 ActionContext context = ActionContext.getContext(); ValueStack vs = context.getValueStack(); //压栈操作 vs.push(new Student("泰斯特",21)); /* * ValueStack的其他方法 * setValue(String expr, Object value); * String expr:它是一个OGNL表达式 * Object value:我们要操作的数据 * 把数据存到哪里去? * 看expr是否使用了# * 如果使用了#,操作的就是ContextMap中 * 如果没使用#,操作的就是ValueStack */ vs.setValue("#name", "张三");//把数据放到ContextMap中。 key是name valeu=张三 vs.setValue("name", "李四");//把ValueStack中第一个name属性的值换成李四。如果没有一个name属性的对应的setName方法,会报错。 /* *set(String key, Object o); * String key : Map的key * Object o : map的value * 如果栈顶是一个Map元素,直接把key作为map的key,把Object作为map的value存入。存入的是栈顶。 * 如果栈顶不是一个Map元素,创建一个Map对象,把key作为map的key,把Object作为map的value,压入栈顶。 */ vs.set("s1", new Student("王五",18)); vs.push(new Student("test",23)); vs.set("s2", new Student("aaa",28));
|
B:取数据
存方式有两种 那么取方式肯定会存在两种
使用s:property取数据
1、取contextMap中的数据,需使用#
![](https://images2015.cnblogs.com/blog/1090008/201701/1090008-20170112191900213-1786867184.png)
2、取contextMap里面ValueStack中对象的属性:直接写属性名
![](https://images2015.cnblogs.com/blog/1090008/201701/1090008-20170112191912306-1525785688.png)
特殊说明:当s:property不给定value属性时,默认取栈顶对象。
OGNL的使用总结:
1.取根中对象的属性,不使用#。
2.取contextMap中key的值,要使用#。