
一个. OGNL中的#,%和$符号
#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里我们简单介绍它们的相应用途。
1. #symbols的三种用法
1)要访问非根对象的属性(如示例中的#session.msg表达式),由于Struts 2中的值堆栈被视为根对象,因此在访问时需要添加#前缀其他非根对象. 实际上,#等效于ActionContext. getContext(); #session.msg表达式等效于ActionContext.getContext(). getSession(). getAttribute(“ msg”).
2)用于过滤和投影诸如人的集合. 示例中的{?#this.age> 20}.
3)用于构建地图,例如示例中的#{'foo1': 'bar1','foo2': 'bar2'}.
2. %符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>
<p>不使用%:<s:url value="#foobar['foo1']" /></p>
<p>使用%:<s:url value="%{#foobar['foo1']}" /></p>
正在运行的界面如下所示.
键“ foo1”的值是bar1
请勿使用%: #foobar [‘foo1’]
使用%: bar1
3. $符号
$符号有两个主要用途.
1) 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
2) 在Struts 2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:
<validators>
<field name="intb">
<field-validator type="int">
<param name="min">10</param>
<param name="max">100</param>
<message>BAction-test校验:数字必须为${min}为${max}之间!</message>
</field-validator>
</field>
</validators>

两个. 让我们看一下常见的OGNL表达式:
1. 使用OGNL调用静态成员时
在实际开发中,绝对拒绝使用硬编码来进行页面参数传递. 最好的解决方案有两种: 一种是在国际配置文件中编写;另一种是在国际配置文件中编写. 另一种是创建一个类. 特别维护静态成员,并在所有硬编码位置调用它.
Struts2提供了一些默认访问静态成员的方法,但是默认情况下它们是关闭的ognl表达式运算,因此应首先在struts2配置文件中设置它们
设置后,您可以使用以下表达式访问静态成员.
1)访问静态方法
<s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>
2)访问静态常量
<s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>
2. 对于OGNL,java.lang.Math是默认类. 如果调用java.lang.Math的静态方法,则无需指定类的名称,例如: @@ min(4,10);
3. 对于OGNL,数组和集合是相同的,可以通过下标索引对其进行访问.
获取列表:
获取列表中的元素(可以使用类似于数组的下标来获取列表中的内容):
获取设置:
获取Set中的元素(Set没有顺序,因此您不能使用下标获取数据):
×
获取地图:
获取地图中的所有键:

获取地图中的所有值
获取Map中的元素(可以使用类似于数组的下标来获取List中的内容):
获取列表的大小:
4. 使用OGNL处理Map的语法格式如下:
#{‘key1’: ‘value1’, ‘key2’: ‘value2’, ‘key3’: ‘value3’};
5. 过滤: 收集. {?表达式}
6. OGNL为集合提供了一些伪属性(例如size,isEmpty),使我们可以通过属性调用方法(根本原因是集合中的许多方法不符合JavaBean的命名规则),但是我可以通过调用方法仍然可以达到与伪属性相同的目的.
7. 进行过滤以获取集合中的第一个元素: collection. {^ expression}
8. 进行过滤以获取集合中的最后一个元素: 集合. {&expression}
9. 使用过滤操作时,我们通常使用#this,它表示当前正在迭代的集合中的对象(与for循环相关联的增强功能)
10. 投影: 集合. {expression}
11. 过滤和投影之间的区别: 类似于中的表,过滤是获取行的操作,而投影是获取列的操作. 具体示例如下:
使用选择获取通过列表的对象: = 60}” />
使用选择获取通过评分的列表中对象的用户名:
= 60}. {username}” />
使用选择获取列表中通过评分的第一个对象的用户名:
= 60}. {username} [0]” />
使用选择获取列表中通过评分的第一个对象的用户名:

= 60}. {username}” />
使用选择获取通过评分的列表中最后一个对象的用户名:
= 60}. {username}” />
使用选择获取列表中通过成绩的第一个对象并找到大小:
= 600}. {username} .size” />
12. 在Struts2中,根对象是ValueStack. 在Struts2的任何过程中,ValueStack中最顶层的对象必须是Action对象.
13. 参数,#parameters.username
请求,#request.username
会话,#session.username
应用程序,#application.username
attr,#attr.username
以上对象称为“命名对象”.
14. 改进了对静态方法或静态成员变量的访问.
@ vs @ method
15. 关于Struts2标记库的属性值中%和#之间的关系:
1). 如果标记的属性值为OGNL表达式,则无需添加%{}.
2). 如果标签的属性值是字符串类型,那么字符串中出现的任何%{}都会被解析为OGNL表达式,并且在解析完成之后,它将与其他字符串进行拼接以构造最终的字符串值.
3). 我们可以将%{}添加到所有属性值,以便如果属性值是OGNL表达式,则标签处理类将忽略%{}.

16 ** lambda表达式,在OGNL中使用一些简单的函数**
1个lambda表达式
这个表达式,我其实也很少去用,这里给大家拿个例子讲解一下吧
<s:property value="#conv =:[#this==1?'男':#this==2?'女':''], #conv(1)" />
这句的作用就是,value="#conv =: 定义一个函数 conv
[#this==1?'男' 定义 conv(1)=男
#this==2?'女' 定义 conv(2)=女
当然这个只是一个简单的例子,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体讲解,引用别人的一个例子
示例:
斐波那契:
如果n == 0,则返回0;
elseif n == 1返回1;
else return fib(n-2)+ fib(n-1);
fib(0)= 0
fib(1)= 1
fib(11)= 89
OGNL的Lambda表达式如何工作?
Lambda表达式必须放在方括号内ognl表达式运算,#这表示表达式的参数. 例如:
fib =: [#this == 0? 0: #this == 1? 1: #fib(#this-2)+#fib(#this-1)]定义Lambda表达式,
fib(11)调用此表达式.
最后,让我们一起讨论代码,并简要介绍ognl操作的示例:
1)在上下文中使用OGNL
public static void main(String[] args)
{
Map<String , Object> context = new HashMap<String , Object>();
Person person1 = new Person();
person1.setName("zhangsan");
Person person2 = new Person();
person2.setName("lisi");
Person person3 = new Person();
person3.setName("wangwu");
Person person4 = new Person();
person4.setName("zhaoliu");
context.put("person1", person1);
context.put("person2", person2);
context.put("person3", person3);
try
{
Object value = Ognl.getValue("name", context, person2);
System.out.println("ognl expression \"name\" evaluation is : " + value);
Object value2 = Ognl.getValue("#person2.name", context, person2);
System.out.println("ognl expression \"#person2.name\" evaluation is : " + value2);
Object value3 = Ognl.getValue("#person1.name", context, person2);
System.out.println("ognl expression \"#person1.name\" evaluation is : " + value3);
Object value4 = Ognl.getValue("name", context, person4);
System.out.println("ognl expression \"name\" evaluation is : " + value4);
Object value5 = Ognl.getValue("#person4.name", context, person4);
System.out.println("ognl expression \"person4.name\" evaluation is : " + value5);
// Object value6 = Ognl.getValue("#person4.name", context, person2);
// System.out.println("ognl expression \"#person4.name\" evaluation is : " + value6);
}
2)使用OGNL调用方法
public static void main(String[] args)
{
OgnlContext context = new OgnlContext();
People people1 = new People();
people1.setName("zhangsan");
People people2 = new People();
people2.setName("lisi");
People people3 = new People();
people3.setName("wangwu");
context.put("people1", people1);
context.put("people2", people2);
context.put("people3", people3);
context.setRoot(people1);
try
{
Object value = Ognl.getValue("name.length()", context, context.getRoot());
System.out.println("people1 name length is :" + value);
Object upperCase = Ognl.getValue("#people2.name.toUpperCase()", context, context.getRoot());
System.out.println("people2 name upperCase is :" + upperCase);
Object invokeWithArgs = Ognl.getValue("name.charAt(5)", context, context.getRoot());
System.out.println("people1 name.charAt(5) is :" + invokeWithArgs);
Object min = Ognl.getValue("@java.lang.Math@min(4,10)", context, context.getRoot());
System.out.println("min(4,10) is :" + min);
Object e = Ognl.getValue("@java.lang.Math@E", context, context.getRoot());
System.out.println("E is :" + e);
}
3)使用OGNL操纵集合
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-285446-1.html
抽检是随机调查
坚决抵制这种行为