struts2的OGNL表达式(二)

2024-04-26 12:32
文章标签 表达式 struts2 ognl

本文主要是介绍struts2的OGNL表达式(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面说说OGNL表达式的访问情况:

OGNL表达式能访问:访问属性访问方法访问字体对象,访问静态属性和方法,访问构造方法,访问数组访问集合 – 投影、选择(? ^ $)

1,OGNL输出常量值

<s:property value="常量值"/>可以输出字符串常量.

字符串常量(string literal)
    以单引号或双引号括起来的字符串,例如:‘Hello World’和”Hello World”.在JAVA中,不能用单引号来界定字符串常量,而在OGNL中是可以的。不过特别要注意的是:如果是单个字符的字符串常量,则必须使用双引号来界定,例如:“S”。OGNL的字符串也支持转义序列,例如:要在JSP页面中输出”You said ,”Hello World”.”,那么可以使用<s:property>标签,如下:
<s:property value=“’You said,\”Hello World\”.’”/>
      注意:不要忽略了用于界定整个常量字符串的单引号。如果没有写单引号,那么整个字符串将不会被看成是字符串常量,而是被当作根对象的属性名,从而导致错误。
字符常量(Character literal)
     以单引号括起来的字符。例如,‘H’。注意,不能使用双引号,否则将被看成是字符串常量。
数值常量(Numeric literal)
除了Java中的int,long,float,double外,OGNL还让你用“B”或“b”后缀指定BigDecimal常量,用“H”或”h”后缀指定BigInteger常量,例如,123(int常量),123l(long常量),123.35f(float常量),123b(BigDecimal常量),123h(BigInteger常量)。


2,获取Action中的属性值或者Action中的对象的某某属性值

注意这里的username是action中的属性,user是action中的属性对象,因为action是放在值栈中的所以不需要使用#字号访问

访问属性:<s:property value="username"/>
访问对象属性(get和set):<s:property value="user.age"/>
访问对象方法:<s:property value="user.getName()"/>
访问对象属性(get和set):<s:property value="employee.manager.name"/>


3,调用Action的对象里面的普通方法

       默认的会把Action放到值栈里面,而值栈在访问的时候,并不需要值栈的名字
当我们调用<s:property value="user.getVOMethod()"/>的时候,它会自动到值栈里面查找Action对象里面有没有user对象,然后它就发现有user,然后它就再找user里面有没有getVOMethod()方法,然后它发现有,于是调用getVOMethod(),实际上调用User中的getVOMethod()方法的过程与获取表单中的姓名密码的方式都是相同的,都是到值栈里面查找,找是否存在user对象,如果存在,接着查找user中是否存在某某属性或方法

访问类对象的方法:<s:property value="employee.eat()"/>访问action的方法:<s:property value="add()"/>


4,访问Action中的静态属性和方法

以@开头,后面跟上具体的包名,然后@加上静态方法

<span style="font-size:24px;">比如<s:property value="@com.jadyer.action.LoginAction@getStatic()"/></span>

OGNL支持调用类中的静态方法和静态字段,格式如下:

@class@method(args)//调用静态方法
@class@field//访问静态字段(public权限)

其中class必顺给出完整的类名。例如:@java.lang.String@valueOf(5)。如果省略class,那么默认使用类是java.lang.Math

访问静态方法:<s:property value="@com.neusoft.ognl.StaticSample@ma()"/> 
访问静态属性:<s:property value="@com.neusoft.ognl.StaticSample@STR"/>
访问Math静态方法:<s:property value="@@max(4,7)"/>


5,访问的构造方法

<span style="font-size:24px;">访问构造方法:<s:property value="new com.neusoft.ognl.User(44)"/></span>


6,OGNL创建和访问集合数组

a,OGNL创建集合

    如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。可以使用如下代码直接生成一个List对象

创建集合:<s:property value="{'a','b','c'}"/> <!--输出结果为:[a,b,c]-->
集合类型:<s:property value="{'a','b','c'}.getClass().getName()"/><!--输出类型名称是java.util.ArrayList-->  
    如下代码可以直接生成一个Map对象:

创建Map:<s:property value="#{'mm':'MM','nn':'NN'}"/>"<!--输出结果为:{mm=MM,nn=NN}-->
Map类型:<s:property value="#{'mm':'MM','nn':'NN'}.getClass().getName()"/><strong style="color: rgb(255, 0, 0);">  </strong><!--输出类型名称是java.util.LinkedHashMap-->

b,OGNL访问集合

  

<li>访问List:<s:property value="users"/> </li>
<li>访问List中某个元素:<s:property value="users[0]"/>  </li>
<li>访问List中元素某个属性的集合:  <s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:  <s:property value="users.{age}[0]"/>|<s:property value="users[0].age"/> </li>

<li>访问Set:<s:property value="managers"/></li>
<li>访问Set中某个元素:<s:property value="managers[0]"/></li><!-- 错误,无法根据下标访问元素 -->

<li>访问Map:<s:property value="manMap"/></li>
<li>访问Map中某个元素:<s:property value="manMap.mm1"/>|<s:property value="manMap['mm1']"/>|<s:property value="manMap[\"mm1\"]"/></li>
<li>访问Map中所有的key:<s:property value="manMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="manMap.values"/></li>
<li>访问容器的大小:<s:property value="manMap.size()"/></li><strong>
</strong>

c,集合中的伪属性

    OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.

这篇关于struts2的OGNL表达式(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937593

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采