OGNL表达式的基本语法和用法

电脑杂谈  发布时间:2020-07-19 03:19:44  来源:网络整理

ognl表达式运算_ognl表达式教程_ognl 表达式 使用

一个. 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表达式运算_ognl 表达式 使用_ognl表达式教程

两个. 让我们看一下常见的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没有顺序,因此您不能使用下标获取数据):

×

获取地图:

获取地图中的所有键:

ognl表达式运算_ognl表达式教程_ognl 表达式 使用

获取地图中的所有值

获取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]” />

使用选择获取列表中通过评分的第一个对象的用户名:

ognl表达式教程_ognl表达式运算_ognl 表达式 使用

= 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表达式,则标签处理类将忽略%{}.

ognl表达式教程_ognl表达式运算_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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...