`
songylwq
  • 浏览: 126797 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

struts2 OGNL的用法介绍

 
阅读更多

在上篇博客,我们一起看了《ognl概念和原理详解》,我们大约的知道了ognl的基本实现原理和一些基本概念,这节我们一起来学习一下OGNL表达式的基本语法和基本用法,首先我们一起来看一下OGNL中的#%$符号

一.OGNL中的#%$符号

#%$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里我们简单介绍它们的相应用途。

1#符号的三种用法

1访问非根对象属性,例如示例中的#session.msg表达式,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext()#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute("msg")

2用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}

3用来构造Map,例如示例中的#{'foo1':'bar1','foo2':'bar2'}

2%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:

<h3>构造Map</h3>

<s:setname="foobar"value="#{'foo1':'bar1','foo2':'bar2'}"/>

<p>Thevalueofkey"foo1"is<s:propertyvalue="#foobar['foo1']"/></p>

<p>不使用%:<s:urlvalue="#foobar['foo1']"/></p>

<p>使用%:<s:urlvalue="%{#foobar['foo1']}"/></p>

运行界面如下所示。

hevalueofkey"foo1"isbar1

不使用%#foobar['foo1']

使用%bar1

3$符号

$符号主要有两个方面的用途。

1在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}${max}之间。

2Struts2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:

  1. <validators>
  2. <fieldname="intb">
  3. <field-validatortype="int">
  4. <paramname="min">10</param>
  5. <paramname="max">100</param>
  6. <message>BAction-test校验:数字必须为${min}为${max}之间!</message>
  7. </field-validator>
  8. </field>
  9. </validators>


二.我们一起看一下OGNL常用表达式:

1.当使用OGNL调用静态方法的时候,需要按照如下语法编写表达式:

@package.classname@methodname(parameter)

2.对于OGNL来说,java.lang.Math是其的默认类,如果调用java.lang.Math的静态方法时,无需指定类的名字,比如:@@min(4,10);

3.对于OGNL来说,数组与集合是一样的,都是通过下标索引来去访问的。

获取List:<s:propertyvalue="testList"/><br>

获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

<s:propertyvalue="testList[0]"/><br>

获取Set:<s:propertyvalue="testSet"/><br>

获取Set中的某一个元素(Set由于没有顺序,所以不能使用下标获取数据):

<s:propertyvalue="testSet[0]"/><br>×

获取Map:<s:propertyvalue="testMap"/><br>

获取Map中所有的键:<s:propertyvalue="testMap.keys"/><br>

获取Map中所有的值:<s:propertyvalue="testMap.values"/><br>

获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

<s:propertyvalue="testMap['m1']"/><br>

获取List的大小:<s:propertyvalue="testSet.size"/><br>

4.使用OGNL来处理映射(Map)的语法格式如下所示:

#{‘key1’:‘value1’,‘key2’:‘value2’,‘key3’:‘value3’};

5.过滤(filtering):collection.{?expression}

6.OGNL针对集合提供了一些伪属性(如size,isEmpty),让我们可以通过属性的方式来调用方法(本质原因在于集合当中的很多方法并不符合JavaBean的命名规则),但我么你依然还可以通过调用方法来实现与伪属性相同的目的。

7.过滤(filtering),获取到集合中的第一个元素:collection.{^expression}

8.过滤(filtering),获取到集合中的最后一个元素:collection.{&expression}

9.在使用过滤操作时,我们通常都会使用#this,该表达式用于代表当前正在迭代的集合中的对象(联想增强的for循环)

10.投影(projection):collection.{expression}

11.过滤与投影之间的差别:类比于数据库中的表,过滤是取行的操作,而投影是取列的操作。具体举例如下:

利用选择获取List中成绩及格的对象:<s:propertyvalue="stus.{?#this.grade>=60}"/><br>

利用选择获取List中成绩及格的对象的username:

<s:propertyvalue="stus.{?#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的第一个对象的username:

<s:propertyvalue="stus.{?#this.grade>=60}.{username}[0]"/><br>

利用选择获取List中成绩及格的第一个对象的username:

<s:propertyvalue="stus.{^#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的最后一个对象的username:

<s:propertyvalue="stus.{$#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的第一个对象然后求大小:

<s:propertyvalue="stus.{^#this.grade>=600}.{username}.size"/><br>

12.在Struts2中,根对象就是ValueStack。在Struts2的任何流程当中,ValueStack中的最顶层对象一定是Action对象。

13.parameters,#parameters.username

request,#request.username

session,#session.username

application,#application.username

attr,#attr.username

以上几个对象叫做“命名对象”。

14.访问静态方法或是静态成员变量的改进。

@vs@method

15.关于Struts2标签库属性值的%与#号的关系:

1).如果标签的属性值是OGNL表达式,那么无需加上%{}。

2).如果标签的属性值是字符串类型,那么在字符串当中凡是出现的%{}都会被解析成OGNL表达式,解析完毕后再与其他的字符串进行拼接构造出最后的字符串值。

3).我们可以在所有的属性值上加%{},这样如果该属性值是OGNL表达式,那么标签处理类就会将%{}忽略掉。

最后一起用代码说话,简单的看一下ognl操作的示例:

1)上下文环境中使用OGNL

  1. publicstaticvoidmain(String[]args)
  2. {
  3. /*创建一个上下文Context对象,它是用保存多个对象一个环境对象*/
  4. Map<String,Object>context=newHashMap<String,Object>();
  5. Personperson1=newPerson();
  6. person1.setName("zhangsan");
  7. Personperson2=newPerson();
  8. person2.setName("lisi");
  9. Personperson3=newPerson();
  10. person3.setName("wangwu");
  11. /*person4不放入到上下文环境中*/
  12. Personperson4=newPerson();
  13. person4.setName("zhaoliu");
  14. /*将person1、person2、person3添加到环境中(上下文中)*/
  15. context.put("person1",person1);
  16. context.put("person2",person2);
  17. context.put("person3",person3);
  18. try
  19. {
  20. /*获取根对象的"name"属性值*/
  21. Objectvalue=Ognl.getValue("name",context,person2);
  22. System.out.println("ognlexpression\"name\"evaluationis:"+value);
  23. /*获取根对象的"name"属性值*/
  24. Objectvalue2=Ognl.getValue("#person2.name",context,person2);
  25. System.out.println("ognlexpression\"#person2.name\"evaluationis:"+value2);
  26. /*获取person1对象的"name"属性值*/
  27. Objectvalue3=Ognl.getValue("#person1.name",context,person2);
  28. System.out.println("ognlexpression\"#person1.name\"evaluationis:"+value3);
  29. /*将person4指定为root对象,获取person4对象的"name"属性,注意person4对象不在上下文中*/
  30. Objectvalue4=Ognl.getValue("name",context,person4);
  31. System.out.println("ognlexpression\"name\"evaluationis:"+value4);
  32. /*将person4指定为root对象,获取person4对象的"name"属性,注意person4对象不在上下文中*/
  33. Objectvalue5=Ognl.getValue("#person4.name",context,person4);
  34. System.out.println("ognlexpression\"person4.name\"evaluationis:"+value5);
  35. /*获取person4对象的"name"属性,注意person4对象不在上下文中*/
  36. //Objectvalue6=Ognl.getValue("#person4.name",context,person2);
  37. //System.out.println("ognlexpression\"#person4.name\"evaluationis:"+value6);
  38. }


2使用OGNL调用方法

  1. publicstaticvoidmain(String[]args)
  2. {
  3. /*OGNL提供的一个上下文类,它实现了Map接口*/
  4. OgnlContextcontext=newOgnlContext();
  5. Peoplepeople1=newPeople();
  6. people1.setName("zhangsan");
  7. Peoplepeople2=newPeople();
  8. people2.setName("lisi");
  9. Peoplepeople3=newPeople();
  10. people3.setName("wangwu");
  11. context.put("people1",people1);
  12. context.put("people2",people2);
  13. context.put("people3",people3);
  14. context.setRoot(people1);
  15. try
  16. {
  17. /*调用成员方法*/
  18. Objectvalue=Ognl.getValue("name.length()",context,context.getRoot());
  19. System.out.println("people1namelengthis:"+value);
  20. ObjectupperCase=Ognl.getValue("#people2.name.toUpperCase()",context,context.getRoot());
  21. System.out.println("people2nameupperCaseis:"+upperCase);
  22. ObjectinvokeWithArgs=Ognl.getValue("name.charAt(5)",context,context.getRoot());
  23. System.out.println("people1name.charAt(5)is:"+invokeWithArgs);
  24. /*调用静态方法*/
  25. Objectmin=Ognl.getValue("@java.lang.Math@min(4,10)",context,context.getRoot());
  26. System.out.println("min(4,10)is:"+min);
  27. /*调用静态变量*/
  28. Objecte=Ognl.getValue("@java.lang.Math@E",context,context.getRoot());
  29. System.out.println("Eis:"+e);
  30. }


3使用OGNL操作集合

  1. publicstaticvoidmain(String[]args)throwsException
  2. {
  3. OgnlContextcontext=newOgnlContext();
  4. Classroomclassroom=newClassroom();
  5. classroom.getStudents().add("zhangsan");
  6. classroom.getStudents().add("lisi");
  7. classroom.getStudents().add("wangwu");
  8. classroom.getStudents().add("zhaoliu");
  9. classroom.getStudents().add("qianqi");
  10. Studentstudent=newStudent();
  11. student.getContactWays().put("homeNumber","110");
  12. student.getContactWays().put("companyNumber","119");
  13. student.getContactWays().put("mobilePhone","112");
  14. context.put("classroom",classroom);
  15. context.put("student",student);
  16. context.setRoot(classroom);
  17. /*获得classroom的students集合*/
  18. Objectcollection=Ognl.getValue("students",context,context.getRoot());
  19. System.out.println("studentscollectionis:"+collection);
  20. /*获得classroom的students集合*/
  21. ObjectfirstStudent=Ognl.getValue("students[0]",context,context.getRoot());
  22. System.out.println("firststudentis:"+firstStudent);
  23. /*调用集合的方法*/
  24. Objectsize=Ognl.getValue("students.size()",context,context.getRoot());
  25. System.out.println("studentscollectionsizeis:"+size);
  26. System.out.println("--------------------------飘逸的分割线--------------------------");
  27. ObjectmapCollection=Ognl.getValue("#student.contactWays",context,context.getRoot());
  28. System.out.println("mapCollectionis:"+mapCollection);
  29. ObjectfirstElement=Ognl.getValue("#student.contactWays['homeNumber']",context,context.getRoot());
  30. System.out.println("thefirstelementofcontactWaysis:"+firstElement);
  31. System.out.println("--------------------------飘逸的分割线--------------------------");
  32. /*创建集合*/
  33. ObjectcreateCollection=Ognl.getValue("{'aa','bb','cc','dd'}",context,context.getRoot());
  34. System.out.println(createCollection);
  35. /*创建Map集合*/
  36. ObjectcreateMapCollection=Ognl.getValue("#{'key1':'value1','key2':'value2'}",context,context.getRoot());
  37. System.out.println(createMapCollection);
  38. }
  39. }

分享到:
评论

相关推荐

    struts2 ognl的用法

    struts2的ognl

    struts2 ognl用法项目

    主要是ognl的用法,很适合新手上路的,源代码很清晰可见,一看就懂

    struts2_ognl基本用法.doc

    struts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_ognl基本用法.docstruts2_...

    struts2 ognl表达式

    struts2中ognl表达式的用法,详细介绍了ognl表达式与struts2基本标签的结合。

    OGNL学习笔记,包含struts2中ognl的各种用法

    struts2 OGNL的主要用法 基本覆盖全部

    struts2_OGNL表达式ActionContext及valuesStack

    struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号

    Struts2 ognl中的#、%和$符号用法说明

    NULL 博文链接:https://hezhou-0521.iteye.com/blog/777463

    struts2中siterator 标签的使用详解 及 OGNL用法

    struts2中siterator 标签的使用详解 及 OGNL用法 struts2中siterator 标签的使用详解 及 OGNL用法

    struts2 OGNL之&lt;s:property&gt;标签访问值栈(value stack)用法

    struts2 OGNL之标签访问值栈(value stack)用法,希望能对大家有帮助

    Struts2 OGNL调用公共静态方法详细介绍

    一直以来都知道Struts2的OGNL支持在前台调用后台的静态方法,以前也用过,但用的比较少,今天自己重新开始了一个新的项目,在实现一个功能的时候用到了Struts2的在前台调用后台的静态方法,弄了半天没有出来结果,...

    Struts2_OGNL 笔记

    OGNL是通常要结合Struts 2的标志一起使用,如等。大家经常遇到的问题是#、%和$这三个符号的使用。下面我想通过例子讲述这个问题: 首先新建名为Struts2_OGNL的Web工程,配置开发环境。之前很多朋友在使用Struts 2的...

    精通struts2的ognl表达式

    最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然...

    Struts 2中的OGNL

    struts ognl 的常用用法大全.“#”主要有三种用途:

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系...用法:OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用;

    struts2中ognl的源代码

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,...

    struts2下ognl源代码

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,...

    struts2中ognl表达式的理解和用法

    NULL 博文链接:https://laz383310051.iteye.com/blog/754884

    Struts2核心包

    freemarker-2.3.16.jar:Struts 2的UI标签的模板使用FreeMarker编写。 commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此文件。 commons-io-1.3.2.jar:IO输入输出流组件,主要完成文件的读写功能...

    struts2讲义_吴峻申

    10.1 sitemesh基本使用方法 194 10.2 sitemesh高级应用 198 10.2.1 和标签的使用介绍 198 10.2.2 、和标签的使用介绍 200 附录 204 附录1 安装JBoss让它部署Web项目 204 F1.1 安装 204 F1.2 手工部署Web项目 207 ...

    Struts2教程

    上来说 Struts2 是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。 如果大家使用过 Struts1.x ,应该对建立基于 Struts1.x 的 Web 程序的基本步骤非常清楚。 让我们先来回顾一下建立基于 Struts1.x 的 ...

Global site tag (gtag.js) - Google Analytics