[首页]
[文章]
[教程]
首页
Web开发
Windows开发
编程语言
数据库技术
移动平台
系统服务
微信
设计
布布扣
其他
数据分析
首页
>
其他
> 详细
OGNL表达式struts2标签“%,#,$”
时间:
2015-05-03 00:46:07
阅读:
285
评论:
0
收藏:
0
[点我收藏+]
一、什么是OGNL,有什么特点?
OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:
1
、支持对象方法调用,形式如:objName.methodName();
2
、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 | 值名],例如:
@java
.lang.String
@format
(
‘foo %s‘
,
‘bar‘
)或
@tutorial
.MyConstant
@APP_NAME
;
3
、支持赋值操作和表达式串联,例如:
price=
100
, discount=
0.8
, calculatePrice(),这个表达式会返回
80
;
4
、访问OGNL上下文(OGNL context)和ActionContext;
5
、操作集合对象。
二、使用OGNL表达式
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。
1
、“#”符号有三种用途:
(
1
)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称
作用
例子
parameters
包含当前HTTP请求参数的Map
#parameters.id[
0
]作用相当于request.getParameter(
"id"
)
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute(
"userName"
)
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute(
"userName"
)
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute(
"userName"
)
注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#
this
.price<
100
};构造Map,如#{
‘foo1‘
:
‘bar1‘
,
‘foo2‘
:
‘bar2‘
}。
(
2
)、用于过滤和投影(projecting)集合,如: books.{?#
this
.price>
35
}
books.{?#
this
.price>
35
}
(
3
)、构造Map,如: #{
‘foo1‘
:
‘bar1‘
,
‘foo2‘
:
‘bar2‘
}
#{
‘foo1‘
:
‘bar1‘
,
‘foo2‘
:
‘bar2‘
}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:
<s:property value=
"#myMap[‘foo1‘]"
/>
<s:property value=
"#myMap[‘foo1‘]"
/>
2
、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :
var oDiv = eval_r(
"document.all.div"
+index)
var oDiv = eval_r(
"document.all.div"
+index)
当index变量为
1
时,语句就会被当作var oDiv = document.all.div1 var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:
<s:set name=
"myMap"
value=
"#{‘key1‘:‘value1‘,‘key2‘:‘value2‘}"
/>
<s:property value=
"#myMap[‘key1‘]"
/>
<s:url value=
"#myMap[‘key1‘]"
/>
<s:set name=
"myMap"
value=
"#{‘key1‘:‘value1‘,‘key2‘:‘value2‘}"
/>
<s:property value=
"#myMap[‘key1‘]"
/>
<s:url value=
"#myMap[‘key1‘]"
/>
上面的代码第
2
行会在页面上输出“value1”,而第
3
行则会输出
"#myMap[‘key1‘]"
这么一个字符串。 如果将第
3
行改写成这样:
<s:url value=
"%{#myMap[‘key1‘]}"
/>
<s:url value=
"%{#myMap[‘key1‘]}"
/>
则输出为“value1”。
这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap[
‘key1‘
]”的语句时,就要用%{}来把这括进去,“翻译”一下了。
3
、“$”有两种用途
(
1
)、在国际化资源文件中,引用OGNL表达式。
(
2
)、在Struts
2
配置文件中,引用OGNL表达式:
<action name=
"saveUser"
class
=
"userAction"
method=
"save"
>
<result type=
"redirect"
>listUser.action?msg=${msg}</result>
</action>
<action name=
"saveUser"
class
=
"userAction"
method=
"save"
>
<result type=
"redirect"
>listUser.action?msg=${msg}</result>
</action>
OGNL表达式struts2标签“%,#,$”
原文:http://www.cnblogs.com/JesseCary/p/4472708.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年09月23日 (328)
2021年09月24日 (313)
2021年09月17日 (191)
2021年09月15日 (369)
2021年09月16日 (411)
2021年09月13日 (439)
2021年09月11日 (398)
2021年09月12日 (393)
2021年09月10日 (160)
2021年09月08日 (222)
最新文章
更多>
2021/09/28 scripts
2022-05-27
vue自定义全局指令v-emoji限制input输入表情和特殊字符
2022-05-27
9.26学习总结
2022-05-27
vim操作
2022-05-27
深入理解计算机基础 第三章
2022-05-27
C++ string 作为形参与引用传递(转)
2022-05-27
python 加解密
2022-05-27
JavaScript-对象数组里根据id获取name,对象可能有children属性
2022-05-27
SQL语句——保持现有内容在后面增加内容
2022-05-27
virsh命令文档
2022-05-27
教程昨日排行
更多>
1.
list.reverse()
2.
Django Admin 管理工具
3.
AppML 案例模型
4.
HTML 标签列表(功能排序)
5.
HTML 颜色名
6.
HTML 语言代码
7.
jQuery 事件
8.
jEasyUI 创建分割按钮
9.
jEasyUI 创建复杂布局
10.
jEasyUI 创建简单窗口
友情链接
汇智网
PHP教程
插件网
关于我们
-
联系我们
-
留言反馈
- 联系我们:wmxa8@hotmail.com
© 2014
bubuko.com
版权所有
打开技术之扣,分享程序人生!