在Struts2中对于值栈的定义中应该充分了解ActionContext的使用,才能充分应用好值栈(ValueStack)

 

ActionContext的基本使用

 

1:如何获取

要获取ActionContext有两个基本的方法,如果在不能获取到ActionInvocation的地方,可以直接使用ActionContext一个静态的getContext方法,就可以访问到当前的ActionContext了,示例如下:

ActionContext actionContext=ActionContext.getContext();

如果在能获取到ActionInvocation的地方,比如在拦截器里面、自定义的Result里面等,可以通过ActionInvocation来获取到ActionContext,示例如下:

ActionContext context=ActionInvocation.getInvocationContext();

2:获取过后,如何使用

       ActionContext主要的功能是用来存放数据的,典型的方法如下:

  • get(String key):根据key从ActionContext当前的存储空间里面获取相应的值
  • put(String key, Object value):把值存储在ActionContext的存储空间里面
  • Map<String,Object> getApplication():返回ServletContext中存储的值
  • Map<String,Object> getSession():返回HttpSession中存储的值
  • Map<String,Object> getContextMap():返回当前context存储的值
  • Map<String,Object> getParameters():返回HttpServletRequest对象里面存储的,客户端提交的参数
  • ValueStack getValueStack():获取OGNL的值栈

对于getXXX的方法,都有对应的setXXX方法,这里就不去赘述了,具体的请参看Struts2的API文档。

ValueStack的基本使用

在上一小节中,看到了ValueStack被包含在ActionContext中,ValueStack也是用来存储对象的,但是它主要是通过OGNL表达式来访问,也就是说,在Struts2里面主要是通过标签来访问的。

ValueStack有一个特点,如果访问的值栈里有多个对象,且相同的属性在多个对象中同时出现,则值栈会按照从栈顶到栈底的顺序,寻找第一个匹配的对象。

1:如何获取

       直接由ActionContext对象的getValueStack()方法即可获取

2:如何使用

       ValueStack主要的功能也是用来存放数据的,典型的方法如下:

  • Object findValue(String expr):根据表达式在value stack中,按照缺省的访问顺序去获取表达式对应的值
  • void setValue(String expr, Object value):根据表达式,按照缺省的访问顺序,向value stack中设置值
  • Object peek():获取value stack中的顶层对象,不修改value stack对象
  • Object pop():获取value stack中的顶层对象,并把这个对象从value stack中移走
  • void push(Object o):把对象加入到value stack对象中,并设置成为顶层对象