Ognl表达式语言

概述

OGNL表达式

       OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。

OGNL优势

      1、支持对象方法调用,如xxx.doSomeSpecial();

       2、支持类静态的方法调用和值访问,表达式的格式:

             @[类全名(包括包路径)]@[方法名 |  值名],例如:

             @java.lang.String@format('foo %s', 'bar')

             或@tutorial.MyConstant@APP_NAME;

       3、支持赋值操作和表达式串联,如price=100, discount=0.8,

             calculatePrice(),这个表达式会返回80;

       4、访问OGNL上下文(OGNL context)和ActionContext;

       5、操作集合对象。

总结

        OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了  java.utils.Map 的接口。 OgnlContext对象

分析:

ü  Struts框架默认就支持Ognl表达式语言。

(struts必须引用的包:ognl.jar)

ü  作用

页面取值用。

 

El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用)

         (应用范围更广。)

Ognl表达式语言, struts标签默认支持的表达式语言。

                                       必须配置struts标签用,不能离开struts标签直接用。


package loaderman.b_ognl;

public class Address {

    private String province;
    private String city;
    
    
    public Address() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Address(String province, String city) {
        super();
        this.province = province;
        this.city = city;
    }
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    
}
package loaderman.b_ognl;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

import org.junit.Test;

// OgnlContext用法
public class OgnlDemo1 {

    /**
     * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#号
     * @throws Exception
     */
    @Test
    public void testOgnl() throws Exception {
        // 创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();
        // 放入数据
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        // 【往非根元素放入数据, 取值的时候表达式要用"#"】
        context.put("user", user);

        // 获取数据(map)
        // 先构建一个Ognl表达式, 再解析表达式
        Object ognl = Ognl.parseExpression("#user.name");
        Object value = Ognl.getValue(ognl, context, context.getRoot());

        System.out.println(value);
    }

    /**
     * 2. Ognl表达式语言语言取值,取根元素的值,不用带#号
     * @throws Exception
     */
    @Test
    public void testOgn2() throws Exception {
        // 创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();
        // 放入数据
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        // 【往根元素放入数据】
        context.setRoot(user);

        // 获取数据(map)
        // 先构建一个Ognl表达式, 再解析表达式
        Object ognl = Ognl.parseExpression("address.province");
        Object value = Ognl.getValue(ognl, context, context.getRoot());

        System.out.println(value);
    }

    /**
     * 3.Ognl对 静态方法调用的支持
     * @throws Exception
     */
    @Test
    public void testOgn3() throws Exception {
        // 创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();

        // Ognl表单式语言,调用类的静态方法
        //Object ognl = Ognl.parseExpression("@Math@floor(10.9)");
        // 由于Math类在开发中比较常用,所以也可以这样写
        Object ognl = Ognl.parseExpression("@@floor(10.9)");
        Object value = Ognl.getValue(ognl, context, context.getRoot());
        System.out.println(value);
    }
}
package loaderman.b_ognl;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

/**
 * struts的数据流转
 *
 */
public class OgnlDemo2 extends ActionSupport{

    // 根元素值
    private User user = new User(100,"Jacks");
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {

        ActionContext ac = ActionContext.getContext();
        // 映射数据
        ac.getContextMap().put("request_data", "request_data");
        // 数据存储request
//        Map<String,Object> map = (Map<String, Object>) ac.get("request");
//        map.put("request_data", "request_data");
//        map.put("cn", "China");

        ac.getSession().put("Session_data", "Session_data");
        ac.getApplication().put("Application_data", "Application_data");


        // 二、值栈对象的存储数据的原理
        ValueStack vs = ac.getValueStack();
        /***************操作根元素的几种方法*****************/
        // 设置数据: 入栈
        //vs.push(new User(1002,"Tom"));    // 栈顶
        //vs.pop();                        // 移除栈顶元素

        // 如何存储?  map结构存储
        //vs.set("user1", new User(1,"Jacky1"));
        //vs.set("user2", new User(2,"Jacky2"));


        return super.execute();
    }

    // 一、获取值栈对象的2种方式
    private void getVs() {
        // 获取值栈对象,方式1:
        HttpServletRequest request = ServletActionContext.getRequest();
        ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");

        // 获取值栈对象,方式2:
        ActionContext ac = ActionContext.getContext();
        ValueStack vs2 = ac.getValueStack();

        System.out.println(vs1 == vs2);//true
    }



}
package loaderman.b_ognl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * struts的数据流转
 *
 */
public class OgnlDemo3 extends ActionSupport{


    @Override
    public String execute() throws Exception {

        // 测试迭代标签

        List<User> list = new ArrayList<User>();
        Map<Integer,User> map = new HashMap<Integer, User>();

        // 初始化
        for (int i=1; i<11; i++) {
            User user = new User(i,"Jack" + i);

            list.add(user);
            map.put(user.getId(), user);
        }

        // 保存
        ActionContext.getContext().getContextMap().put("list", list);
        ActionContext.getContext().getContextMap().put("map", map);

        return super.execute();
    }



}
package loaderman.b_ognl;

public class User {

    private int id;
    private String name;
    private Address address = new Address("广东省","广州");
    
    
    
    public User() {
        super();
    }
    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    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;
    }
    
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="ogn_" extends="struts-default">
        <action name="ognl" class="loaderman.b_ognl.OgnlDemo3">
            <result name="success">/ognl.jsp</result>
        </action>
    </package>
</struts>
原文地址:https://www.cnblogs.com/loaderman/p/10033047.html