struts2中几个核心的组件ActionContext、ValueStack、OGNL表达式

来源:互联网 发布:网络乌拉是什么意思 编辑:程序博客网 时间:2024/04/28 19:09

转自:http://www.iteye.com/topic/1126455

1、ActionContext 


当struts2框架接收到一个HTTP请求时,它立刻创建一个ActionContext、ValueStack、Action对象 

ActionContext里有6个对象,分别是valueStack、parameters、request、session、application、attr 

一个OGNL表达式,必须选择ActionContext中的一个对象作为根对象(root),默认情况下,是选择valueStack作为根对象,如果需要使用另外5个对象作为根对象,需要加上#前缀 

例如: 
Java代码  收藏代码
  1. <s:property value="#session.xxx" />  

如果不加#前缀,则默认使用valueStack作为根对象,这也是最常见的情况,即#valueStack.xxx,相当于xxx 

2、ValueStack(值栈) 

ValueStack中可以存储很多对象,它的一个特性是,它是一个虚拟对象,它可以将自己持有的对象的属性,当成是自己的属性 

比如说,ValueStack中有一个Action对象,而Action对象有一个name字段。那么当用OGNL表达式取name的值的时候,不需要${action.name},而是可以直接${name} 

ValueStack是一个栈的数据结构(FILO),最后进入值栈的对象,总是在ValueStack的栈顶,这个结论很重要,因为栈顶的元素的值,会覆盖栈底的同名元素的值。 

比如说,ValueStack的栈底是一个Action对象,持有一个name字段;栈顶是一个Model对象,也持有一个name字段,那么用${name},取出来的永远是Model对象的name字段,Action对象的name字段是不可见的 

3、OGNL表达式 

这个可以分为2种场景,一种是在<s:>标签的属性里(比如<s:property value="" />),一种是在jsp页面的其他地方 

在<s:>标签的属性里时,要看这个属性定义的类型是什么,如果是string类型,那么属性的值会被当做普通的string,如果不是string类型,那么属性的值会被直接当成OGNL的表达式 

比如说<s:property value="" />,这个标签的value属性的类型是object,那么这个value的值,就会被直接作为OGNL表达式进行解析 

如果想在string类型的属性中使用OGNL表达式,就需要加上${}或者%{} 

在jsp页面的其他地方时(即不在<s:>标签内部),任何情况下都会当成string来处理,这时候如果想使用OGNL表达式,也需要加上${}或者%{} 

4、关于${}和%{}的区别 

根据文档里的描述,OGNL表达式应该用%{}来表示。可是我在实际应用中,基本不会使用<s:>标签,并且都是用${}来取值的,也没有发现任何不妥,不知道是不是版本的原因
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 酷我切歌怎么办 快手暂不支持音乐格式怎么办 上传视频不清晰怎么办 MP4格式嫌大怎么办 课堂派怎么办改成考试 手机信息幕变黑怎么办 手机百度太耗电怎么办 电脑打不开主页面怎么办? 贴吧被永久封了怎么办 晒课视频太大怎么办 有道精品课过期怎么办 手机缓存变小了怎么办 优学院课程过期怎么办 上公开课紧张怎么办 光纤被老鼠咬断怎么办 石灰粉进入眼睛怎么办 幼儿误吃粉笔怎么办? 吃了粉笔应该怎么办 小孩吃了颜料怎么办 小宝宝吃了纸怎么办 孩子不认真听讲怎么办 监控手机软件离线状态怎么办 云课堂忘记密码怎么办 广州办培训机构怎么办 一师一优课账号忘了怎么办 云相册空间不足怎么办 三星云空间不足怎么办 三星储存空间不足怎么办 宁阳县教育局强制补课怎么办 沉迷网络该怎么办英语 29岁沉迷游戏怎么办 学乐云登录不上怎么办 魔方学院无法识别怎么办 路由器卫士忘记密码怎么办 邮箱号忘记密码怎么办 水卡没钱了怎么办 旅行青蛙换手机怎么办 软件尚未受信任怎么办 百度搜不到的怎么办 百度中搜不到怎么办 山寨云网络异常怎么办