OGNL表达式语言

本文详细介绍了OGNL(Object Graph Navigation Language)表达式的使用方法及其在Struts2框架中的应用。内容涵盖OGNL上下文的概念、如何获取不同作用域的对象属性、OGNL在Struts2中的具体实现等。

OGNL (Object Graph Navigation Language),一种强大的表达式语言,能够导航对象结构并访问和设置对象数据

OGNL的核心为OGNL上下文,OGNL上下文相当于一个Map容器.OGNL上下文是OGNL的核心,在OGNL上下文中可以存放多个对象。

可以这样理解,OGNL上下文为一个Map集合,包含了各个对象,通过它中的对象的名字获取对应的对象的属性,一般的,在OGNL上下文中只能有一个对象可以为OGNL上下文的的根。

获取OGNL上下文中的对象的属性:#对象名.属性  相当于调用了该对象的getXXX()方法。当指定对象为根对象的时候,#符号可以舍去

#user.name

#book.name

user.name

据说OGNL比EL更强大,它的特点:

支持对象方法的调用

支持静态方法的调用

支持变量的赋值

可以操作集合数据

 

Struts2中的OGNL

在Struts2中,OGNL提高了Struts2对数据的访问能力。

在Struts2框架中OGNL上下文作用于ctionContext对象  。ActionContext中包含了对个对象,值栈是OGNL上下文中的根

 

context中的对象: 值栈(根)、application、session、request、parameters、attr

获取值栈中的对象,因为值栈是Struts2中OGNL上下文的根,所以可以省略,  ${user.name}    user.name    #user.name

获取application中的对象:#application.name    #application['name']

获取request对象:#request.name    #request['name']

获取session对象:#session.name    #session['name']

获取parameters中的值: #parameters.name    #parameters['name']

获取attr中的值,如果不指定范围,可以使用attr来获取属性值,其搜索范围按照page、request、session、application的次序依次搜索,attr的使用方法: #attr.name  #attr['name']

 

操作普通的属性和方法

Struts2框架中使用OGNL表达式语言需要借助Struts2标签进行输出,引用struts2标签库: <%@ taglib prefix="s" uri="/struts-tags"%>

获取属性:

<s:property value="user.id"/>   <s:property value="user[id]"

对象方法的调用:

<s:property value="user.say()"/>

package com.shensiyuan.struts.bean;

public class Student {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String say(){
        return "我是一个学生";
    }

}


package com.shensiyuan.struts.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.shensiyuan.struts.bean.Student;

public class OGNLAction extends ActionSupport {
    private String name;
    private Student student;
    Map<String,Object> request;
    
    @SuppressWarnings("unchecked")
    public OGNLAction(){
        request=(Map<String, Object>) ActionContext.getContext().get("request");
        student=new Student();
        student.setId(1);
        student.setName("张三");
        setName("tom");
    }
    
    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public Map<String, Object> getRequest() {
        return request;
    }

    public void setRequest(Map<String, Object> request) {
        this.request = request;
    }

    public String execute(){
        request.put("info", "request测试");
        return SUCCESS;
        
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

    <action name="OGNL" class="com.shensiyuan.struts.action.OGNLAction">
            <result name="success">/success.jsp</result>
        </action>
    

 <body>
    <div>
       <h1>操作普通属性</h1>
       属性name值: <s:property value="name"/>
       <br/><hr/>
       学号: <s:property value="student.id"/><br/>
       <!-- <s:property value="student['id']"/> -->
      姓名: <s:property value="student.name"/><br/>
      <!-- <s:property value="student['name']"/> -->
  say()方法: <s:property value="student.say()"/>
      <br/><hr/>
  request中的info值: <s:property value="#request.info"/>
      <!-- <s:property value="#request['info']"/> -->
      
    </div>
  </body>

 <body>
    <a href="OGNL.action">OGNL普通属性方法测试</a>
  </body>

 

 

访问静态方法以及属性

Struts框架中的OGNL表达式支持对象的静态方法,它类似java语言中的静态引入,需要使用字符@进行标注

Struts2中提供了一个是否允许OGNL调用静态方法的常量struts.ognl.allowStaticMethodAccess,默认值为false,也就是不允许直接调用静态方法。需要允许在struts.xml中加上<constant name="struts.ognl.allowStaticMetodAccess" value="false"/> struts2的常量可以在struts-core.jar的defaut.property中看到一些配置常量的默认值

调用静态属性的方法:  @com.bean.Bean@NAME

调用静态方法的方法:  @com.bean.Bean@gretting()

 

访问数组:数组中的每一个元素都有一个角标,通过角标访问其中的某个元素

如:定义了一个arr数组   访问第1个元素:arr[0]    得到数组长度:arr.length

 

访问List、Set、Map集合

不同的集合,数据存储形式不同,所以其访问形式也存在差异。

List集合,使用角标对其进行访问:

list[0]

Set集合存储方式是无序的,这里没有说如何访问。在java中一般使用迭代或者枚举遍历

。。。。

Map集合以key value形似存储,使用OGNL访问,同归获取key来访问value

map.kay  map.['key']    map.keys  //获取所有的key   map.values   //获取所有的value

针对集合:

collection.isEmpty  //判断集合元素是否为空    collection.size()   //获取集合的长度

 

投影与选择

投影与选择操作可以轻松的获取集合中某一列数据的集合,也可以通过条件轻松的过滤掉条件中的某些行

投影

投影是对集合中列的操作。将集合中某一列中的数据取出来单独形成一个集合,这一列数据就是原集合中的投影。

例如一个集合中包含多个学生对象,获取这个集合中所有学生的姓名,就是投影操作。OGNL代码实现:list.{name}   如果是非值栈中的对象需要加上#,也就是#list.{name}

选择

选择是对集合中行的操作。选择就是通过一定条件,获取集合中满足着一条件的数据,所获取的行就是对集合中数据的选择操作

如一个集合中包含多个学生对象,获取这个集合中年龄大于10的所有学生,这就是选择操作。在OGNL中通过如下代码实现:

list.{?#this.age>10}  非值栈对象#list.{?#this.age>10}

对于选择操作,OGNL提供的三个操作符号:

? 获取满足指定条件的所有元素

^ 获取满足指定条件的所有元素中的第一个元素

$ 获取满足指定条件的所有元素中的最后一个元素

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值