zoukankan      html  css  js  c++  java
  • OGNL表达式语言

    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提供的三个操作符号:

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

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

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

  • 相关阅读:
    关于SQL存储过程的问题
    Community Server的体系结构
    cs_Moderate_ApprovePost///cs_Moderate_CheckUser///cs_Moderate_DeletePost
    计划失败
    Menu 菜单栏
    基于混合云存储系统的电影推荐引擎小结
    zookeeper运维管理
    环境变量问题
    关于库
    腾讯猜字游戏
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5312232.html
Copyright © 2011-2022 走看看