jsp表达式语言

jsp表达式<%= %> :将Java变量或表达式的计算结果输出到客户端 <%= date %>类似于<%  out.print(date)  %>

jsp脚本片段<%  %>:嵌套在<%%>中的一条或多条Java程序代码

  <% if (age>=18){ %>

     成人  

  <% }else{  %>

    未成年

   <%  }  %>

OGNL对象图导航语言,是一种表达式语言,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换,通常和Struts标签一起使用#,EL可以单独使用${}

1.OGNL上下文实际上就是一个map对象,存放多个Javabean对象,它有一个上下文根对象,上下文的根对象可以直接使用名后者直接调用它的属性名来访问它的属性值,否则前面要加前缀“#key”

2.struts2的标签库都是使用ONGL表达式来访问ActionContext重点数据对象:<s: property value=""/>

3.struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL 根对象放置到ActionContext中

4.值栈:可以在值栈中放入删除查询对象,访问值栈中的对象不用“#”,Struts2将当前ActionContext实例放置在栈顶,所以在OGNL中引用Action中的属性也可以省略“#”;  

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问;

三个符号:# % $

1.#符号

访问非根对象属性 :

  #session.msg表达式相当于ActionContext.getContext().getSession().getAttribute("msg")

  #parameters.id[0]作用相当于request.getParameter("id")

  #request.userName相当于request.getAttribute("userName")

  #session.userName相当于session.getAttribute("userName")

  #application.userName相当于application.getAttribute("userName")

用于过滤和投影集合:persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]

用于构造map:#{'foo1':'bar1', 'foo2':'bar2'}

2.%符号

在标志的属性为字符串类型时,计算OGNL表达式的值,这个值类似于js中的eval;

3.$符号

在国际化资源文件中,引用OGNL表达式

在Struts2框架的配置文件中引用OGNL表达式

总结OGNL的使用方法

访问属性;访问方法;

访问静态属性和方法:表达式的格式为@[类全名(包括包路径)]@[方法名 |  值名]

  @java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME

访问构造方法:<s:property value="new struts.vo.Student('李晓红' , '美女' , 3 , 25).username"/>

访问数组(set由于没有顺序,不能使用下标获取数据);list;map

访问集合、投影 选择(? ^ $)

  利用选择获取List中成绩及格的第一个对象的username: <s:property value="stus.{?#this.grade>=60}.{username}[0]"/><br>

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

  利用选择获取List中成绩及格的第一个对象的username:<s:property value="stus.{^#this.grade>=60}.{username}"/><br>

  利用选择获取List中成绩及格的最后一个对象的username: <s:property value="stus.{$#this.grade>=60}.{username}"/><br>

集合的伪属性:引用集合的一些特殊属性,但这些属性并不是Javabean模式,如size(),length(),这些即伪属性

  collection:size,isEmpty;  list:iterator; map:keys,values; set:iterator; iterator:next,hasNext; 

使用Lambda :[...]表达式计算阶乘:<s:property value="#f = :[#this==1?1:#this*#f(#this-1)] , #f(4)"/><br>

原文地址:https://www.cnblogs.com/rosehuang/p/6670293.html