zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    46. Permutations 全排列,无重复
    243. Shortest Word Distance 最短的单词index之差
    171. Excel Sheet Column Number Excel列号转数字
    179. Largest Number 用数组中的元素凑一个最大数字
    49. Group Anagrams 多组anagram合并
    电话号码的字母组合(leetcode17)
    最接近的三数之和(leetcode16)
    c#之dynamic类型通过属性获取值(get value by key)
    三数之和(leetcode15)
    java-list与array转换
  • 原文地址:https://www.cnblogs.com/loaderman/p/10033047.html
Copyright © 2011-2022 走看看