值栈?
它是一个轻量级的数据存储中心,为struts2的action,拦截器等服务,这样可以统一管理数据。我们每一次的请求就会创建一个新的值栈,它封装了每一次请求的操作。当然我们在值栈中的命名也是很重要的,相同类型的命名要保持唯一,这样在找值的时候才会迅速,准确。
ValueStack
如何放入到值栈中:
它是狭义的值栈,主要是用来存放EL表达式或者是OGNL表达式的数据。
当我们在action中将数据放入到值栈中的时候,在jsp页面运用EL标签或者是OGNL标签就可以轻松的取出结果来,展现到页面上。
当我们在jsp页面中运用一些标签产生了很多的数据或者是很多的变量的时候,比如我们的<s:iterator/>标签,这样数据都将放在值栈中。
jsp和action中传递参数很多时候都是用实体来传递的,当我们定义个user实体,获取他的get、set方法的时候,这个user实体就存放到了值栈中,在jsp页面就可以通过user.id等来获取,同理,当我们运用反射,实现ModelDriven接口的时候,我们的getmodel方法就会 将相对应的对象保存在值栈中,然后在jsp页面很容易的取到。
我们可以ActionContext.getContext().getValueStack().push(user),将一个变量传入到值栈中。
如何从值栈中取出:
jsp中我们有很多的标签:<s:property value=""/> ,比如用#/{}等符合取出,
使用top语法,比如[1].top.name。
用OGNL来获取值栈。
在拦截器中用valueStack.findValue("user")来获取值栈。
ActionContext
它是action运行的上下文,是一个基本的容器,里面可以装很多的会话、参数等。每一个线程都有唯一的actioncontext,所以它是线程安全的。
ActionContext是放数据的,他其实就是个map,用key和value来映射关系。例如我们可以用ActionContext.getContext().put("roleList", roleList);将这个key value的东东放入进去。
具体用法如下:
request的parameters: 请求中的参数,当前http请求参数的map
例如: #parameters.id[0] 就是 request.getParameter("id")
request的attribute:请求中的属性 ,包含当前httpservletRequest的属性
例如: #request.userName 就是 request.getAttribute("userName")
application的attribute:应用的属性
session:session.getAttribute("user")
如希望访问值栈中Map中的数据,需要在表达式加上一个前缀#,如果没有前缀#,则将在对象栈里进行。
期待更多的理解。