struts2学习dem006_OGNL

来源:互联网 发布:nginx使用场景 编辑:程序博客网 时间:2024/06/06 16:17



一、简述OGNL

OGNL 是object-Graph Navigation Language(对象图导航语言) 的缩写,它是一种功能强大的表达式语言(Expression Language),简称EL。


二、OGNL的应用场景

标签中

<s:property value="user.username"/>

配置文件中:

<result type="redirect">/..?username=${username}</result>


三、OGNL的访问包含哪些

     1》访问属性

Action零用领域对象接收用户输入信息(见一个实体类ov--User类)

访问属性用户名:<s:property value="user.username"/>

当然User类中可以在声明一个对象oth(那个对象的类名---Other类)

访问other类中的属性name:<s:property value="user.oth.name"/>

当然也可以访问静态属性通过这种方式:<s:property value="@包名@属性名"/>(注:这里属性名不能为私有,并且在Struts.xml中必须配<constantname="struts.ognl.allowStaticMethodAccess" value="true"/>下同)

2》访问方法

~~~1~~~访问action中的普通或静态方法getCom() :<s:property value="getCom()"/>

也可以这样<s:proerty value="@包名@getCom()"/> 或者<s:proerty value="@@getCom()"/> 

 (注:这里访问的一定是静态方法,并且在Struts.xml中必须配<constantname="struts.ognl.allowStaticMethodAccess" value="true" />)


~~~2~~~~当然也可以访问jdk中的方法:

如:<s:property value="@java.lang.Math@floor(21.04)"/>


~~~3~~~访问构造方法:

<s:property value="new com.along.vo.User('阿龙','123456').username" />

(注:这里阿龙上面的引号一定是单引号‘ ,这句话的意思访问构造方法中的username)


3》访问集合

~~1~~访问List集合<s:property value="list" />

 a> 访问List集合中某一个元素<s:property value="list[1]" />

 

 b>  如果不想访问内存地址哈希码的无符号16进值:就重写toString()方法,让其按照自己的方法书写:

如:你要在前台显示

   list.add(new User("阿龙","123456","22","男"));
   list.add(new User("阿月","123456","23","女"));

这时直接用<s:property value="list" />访问, 出来的是类名@16进制

如果不想就再类中重写toString()方法

public String toString(){
  return "学生姓名 = " + username + "   学生年龄 = " + age + "   学生性别 = " + sex;
 }

 

 c> 这时前台也可以利用投影技术访问list对象中的某个属性

---如:<s:property value="list.{username}"/>这时获得的是集合中所有的属性username.如果想获得其中第一个username可以通过:<s:property value="list.{username}[0]"/>

 

d>利用选择获取list对象中的满足条件的取出来

如:取出年龄大于22岁的<s:property value="list.{?#this.age>22}"/>这里#this指list中所有对象,

若要取出年龄大于22岁的所有username:<s:property value="list.{?#this.age>22}.{username}"/>

可以更进一步取出年龄大于22岁的第一个username:<s:property value="list.{?#this.age>22}.{username}[0]"/>这个返回的是字符串--阿月

也可以这样取年龄大于22岁第一个username::<s:property value="list.{^#this.age>22}.{username}"/>这个返回的是列表---[阿月]

那么这就意味着可以通过:<s:property value="list.{^#this.age>22}.{username}.size"/>判断其里面值是否存在,存在为1,不存在为0

<注:如果不加?号,取出的是判断布尔型,^符号是开始的意思》

 

~~2~~访问set集合<s:property value="list" />(set集合不容许重复)

访问set集合中某一个元素

首先Object[] objs = set.toArray();//将set转换成数组
然后根据下表访问objs[1]  

也可遍历元素
 
 

for(Object o : objs){
    System.out.println(o);
  


~~3~~访问map集合<s:property value="map" />

访问map集合中某一个元素<s:property value=" list['m1'] " />

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~集合的伪属性~~~~~~~~~~~~~~~~~~~~~~~~~



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


 

 

~~4~~使用lambda表达式

格式:<s:property value=" #f = : [#this==1 ? 1 : 里面所需计算的表达式] ,#f(数值) "/>

如:计算5的阶乘:<s:property value=" #f = :[#this==1?1 : #this*#f(#this-1)], #f(5)"/>

 

(注:这里的函数设为#f,  []中括号里相当于C语言的条件表达式。#this就是指#f(数值)中数值的数5,如果不等于1就在此调用函数#f());


 

原创粉丝点击