【struts2】值栈(后篇)
在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈。
1 ActionContext的基本使用
1.1 如何获取?
要获取ActionContext有两个基本的方法,如果在不能获取到ActionInvocation的地方,可以直接使用ActionContext一个静态的getContext方法,就可以访问到当前的ActionContext了,示例如下:
ActionContext ctx = ActionContext.getContext();
如果在能获取到ActionInvocation的地方,比如在拦截器里面、自定义的Result里面等,可以通过ActionInvocation来获取到ActionContext,示例如下:
ActionContext ctx = actionInvocation.getInvocationContext();
1.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文档。
1.3 应用示例
在《自定义更强大的logger拦截器》和《自定义登陆验证拦截器》中,两个拦截器都使用了ActionContext对象,详细请查看这两篇文章。
2 ValueStack的基本使用
在值栈(前篇)中,我们看到了ValueStack被包含在ActionContext中,ValueStack也是用来存储对象的,但是它主要是通过OGNL表达式来访问,也就是说,在Struts2里面主要是通过标签来访问的。ValueStack有一个特点,如果访问的值栈里有多个对象,且相同的属性在多个对象中同时出现,则值栈会按照从栈顶到栈底的顺序,寻找第一个匹配的对象。
2.1 如何获取?
直接由ActionContext对象的getValueStack()方法即可获取
2.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对象中,并设置成为顶层对象
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的机会并不是很多。
参考资料:http://www.iteye.com/topic/1124526
【struts2】值栈(后篇)的更多相关文章
- struts2值栈内部数据结构详解
值栈是struts2内部一片很重要的区域,我在初学的时候,发现对于值栈这个数据结构的理解不是很深刻.例如OGNLContext是什么,ActionContext和值栈有什么关系.为什么ActionCo ...
- struts2值栈分析
前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易. struts2中利用值栈来存储数据, ...
- 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式
一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...
- Struts2值栈
一.前言 很多事儿啊,就是“成也萧何败也萧何”,细想一些事儿心中有感,当然,感慨和本文毛关系都没有~想起之前有篇Struts2中值栈的博客还未完工,就着心中的波澜,狂咽一把~ 二.正文 博文基于:st ...
- Struts2值栈详解
1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...
- Struts2 - 值栈(ValueStack)
1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...
- struts2 值栈分析
目录 一.值栈分为两个逻辑部分 二.Struts2 利用 s:property 标签和 OGNL表达式来读取值栈中的属性值 1.值栈中的属性值: 2.读取对象栈中对象的属性: 3.默认情况下,Acti ...
- 10.Struts2值栈
1.什么是值栈 * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlValueSta ...
- struts2值栈ValueStack中都有哪些东西?
com.opensymphony.xwork2.dispatcher.HttpServletRequest application com.opensymphony.xwork2.dispatcher ...
- Struts2 值栈总结(ValueStack)
1.获取值栈 //获取值栈的第一种方式 ValueStack valueStack1 = (ValueStack) ServletActionContext.getRequest().getAttri ...
随机推荐
- Ext JS isField为空或不是对象问题的解决
在做Ext Js的DataGrid的时候经常会遇到这种问题,火狐谷歌没有问题,IE8及以下版本就无法通过,经调试会提示: “isField为空或不是对象问题的解决” 这通常是我们在js代码中多加了一个 ...
- 极域电子教室卸载或安装软件后windows7无法启用触摸板、键盘
我今天在win7上装了个极域电子教室,卸载后重启触摸板,键盘都不能用了?连口令都是用屏幕键盘来输入的.进去后看设备管理器,键盘和触摸板,前面都有黄色的告警,而且就是出现了鼠标代码为10的情况?不过吧鼠 ...
- @SuppressLint("NewApi")和@TargetApi()的区别
在Android代码中,我们有时会使用比我们在AndroidManifest中设置的android:minSdkVersion版本更高的方法,此时编译器会提示警告, 解决方法是在方法上加上@Suppr ...
- Android学习之Android studio TraceView和lint工具的使用具体解释
上次讲述了一下Android studio Terminal的使用配置,今天又学习了一下关于Traceview和lint工具的使用. 首先来讲lint吧: Android lint工具是Android ...
- .geodatabase与gdb的相互转换
.geodatabase长得是gdb的全称,确实它们有一定的关系,但也有区别. 简单认识一下 有人也问过我,gdb外表像个文件夹,是怎么实现的.gdb数据库是ESRI特有的数据库,它是一些数据集定义. ...
- jquery 文字滚动大全 scroll 支持文字或图片 单行滚动 多行滚动 带按钮控制滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Jquery——几个注意的小知识
event.stopPropagation() 停止事件冒泡 event.preventDefault()//组织默认行为(例如错误的时候,阻止按钮提交) event.type获取事件类型 event ...
- Hbase master启动报错:Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster Caused by: java.net.UnknownHostException:
Hbase master启动报错: java.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop ...
- SHELL pv uv 统计事例
#!/bin/sh #statistics newplive logs SOURCELOGS=$ ];then echo echo "please input file!" ech ...
- 获取请求真实ip
/** * Copyright (c) 2011-2014, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License ...