在值栈(前篇)咱们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈。html
1 ActionContext的基本使用学习
1.1 如何获取?this
要获取ActionContext有两个基本的方法,若是在不能获取到ActionInvocation的地方,能够直接使用ActionContext一个静态的getContext方法,就能够访问到当前的ActionContext了,示例以下:spa
ActionContext ctx = ActionContext.getContext();
若是在能获取到ActionInvocation的地方,好比在拦截器里面、自定义的Result里面等,能够经过ActionInvocation来获取到ActionContext,示例以下:code
ActionContext ctx = actionInvocation.getInvocationContext();
1.2 获取事后,如何使用?xml
ActionContext主要的功能是用来存放数据的,典型的方法以下:htm
对于getXXX的方法,都有对应的setXXX方法,这里就不去赘述了,具体的请参看Struts2的API文档。对象
1.3 应用示例blog
在《自定义更强大的logger拦截器》和《自定义登录验证拦截器》中,两个拦截器都使用了ActionContext对象,详细请查看这两篇文章。文档
2 ValueStack的基本使用
在值栈(前篇)中,咱们看到了ValueStack被包含在ActionContext中,ValueStack也是用来存储对象的,可是它主要是经过OGNL表达式来访问,也就是说,在Struts2里面主要是经过标签来访问的。ValueStack有一个特色,若是访问的值栈里有多个对象,且相同的属性在多个对象中同时出现,则值栈会按照从栈顶到栈底的顺序,寻找第一个匹配的对象。
2.1 如何获取?
直接由ActionContext对象的getValueStack()方法便可获取
2.2 如何使用?
ValueStack主要的功能也是用来存放数据的,典型的方法以下:
2.3 应用示例
前面的示例中,欢迎页面显示的账号,是从登陆页面填写并传递到后台的数据,假如如今想要修改在欢迎页面显示的账号数据,可是前面从登陆页面填写并传递到后台的数据不须要变化,那么该怎么实现呢?先来分析一下,要想修改result页面显示的值,确定须要在Result处理以前修改这个值,不然等Result处理完成事后再改就没有意义了。所以,能够选用PreResultListener的技术,在里面把值修改好,而后再进行Result处理。另一点,在欢迎页面是经过标签来获取账号的数据并展现的,也就是说值的来源是value stack,所以,在PreResultListener里面要修改的就是value stack里面的值。好了,清楚该干什么事后,来具体看看示例。
1)先来实现PreResultListener,在里面修改value stack里面的值,示例以下:
public class MyPreResult implements PreResultListener{ public void beforeResult(ActionInvocation actionInvocation, String result) { System.out.println("如今处理Result执行前的功能,result="+result); actionInvocation.getInvocationContext().getValueStack().setValue("account", "被修改了"); } }
2)实现了PreResultListener,还须要在运行以前注册,这里选择在Action里面来注册这个监听器,示例以下:
public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; public String execute() throws Exception { this.businessExecute(); ActionContext c = ActionContext.getContext(); MyPreResult pr = new MyPreResult(); c.getActionInvocation().addPreResultListener(pr); return "toWelcome"; } /** * 示例方法,表示能够执行业务逻辑处理的方法, */ public void businessExecute(){ System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag); } //属性对应的getter/setter方法,省略了 }
3)struts.xml、登录界面和欢迎界面都不变。欢迎界面中的<s:property value="account"/>就能够得到MyPreResult类中修改的account值了。
因为一般状况下,向value stack里面压入值都是由Struts2去完成,而访问value stack可能是经过标签中的OGNL表达式,于是直接使用ValueStack的机会并非不少。