Struts2--OGNL

Posted Jason–json

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2--OGNL相关的知识,希望对你有一定的参考价值。

OGNL概念

  对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。

  比EL强大很多的语言。可以获取对象的方法,获取Struts2值栈的数据。是一款第三方表达式语言。

  优势:支持对象方法调用,支持静态的方法和值调用,支持赋值操作和表达式串联  

 入门案例

封装了一个User类

package com.ognl;

public class User {
private String uname;
private String pwd;

public User() {
}

public User(String uname, String pwd) {
this.uname = uname;
this.pwd = pwd;
}

public String getUname() {
return uname;
}

public void setUname(String uname) {
this.uname = uname;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}
}

测试类

package com.ognl;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
import org.junit.Test;

public class Test01 {

    //OGNL表达式调用对象的方法
    @Test
    public void m1() throws OgnlException {
        //获取context
        OgnlContext context = new OgnlContext();
        //获取根对象
        Object root = context.getRoot();
        //执行表达式
        Object value = Ognl.getValue("‘hello world‘.length()", context, root);
        System.out.println(value);
    }

    //OGNL表达式调用类的静态方法
    @Test
    public void m2() throws OgnlException {
        //获取context
        OgnlContext context = new OgnlContext();
        //获取根对象
        Object root = context.getRoot();
        //执行表达式------@全类名@方法
        Object value = Ognl.getValue("@java.lang.Math@random()", context, root);
        System.out.println(value);
    }

    //OGNL表达式获取Root中的数据
    @Test
    public void m3() throws OgnlException {
        //获取context
        OgnlContext context = new OgnlContext();
        context.setRoot(new User("cat","123")); //根对象存入上下文中
        //获取根对象
        Object root = context.getRoot();
        //执行表达式------"属性名"
        Object uname = Ognl.getValue("uname", context, root);
        Object pwd = Ognl.getValue("pwd", context, root);
        System.out.println(uname+"    "+pwd);
    }

    //OGNL表达式获取Context中的数据
    @Test
    public void m4() throws OgnlException {
        //获取context
        OgnlContext context = new OgnlContext();
        //获取根对象
        Object root = context.getRoot();
        //像context中存入数据
        context.put("name","李四");
        //执行表达式------前面加#
        Object name = Ognl.getValue("#name", context, root);
        System.out.println(name);
    }
}

 

Struts2对OGNL的使用

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%><html>
<body>
<h2>Ognl在Struts2坏境中的使用</h2>

<h3>测试:调用对象的方法</h3>
<s:property value="‘hello world‘.length()"/>

<h3>测试:调用对象的静态方法</h3>
<%--默认开闭,需要开启--%>
<s:property value="@java.lang.Math@random()"/>

</body>
</html>

开启静态方法访问

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <!--struts 访问静态方法开启-->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
</struts>

 

  

以上是关于Struts2--OGNL的主要内容,如果未能解决你的问题,请参考以下文章

Struts2 OGNL

Struts2--OGNL

第四节 Struts2 - OGNL详解

Struts2 OGNL

Struts2 OGNL表达式

Struts2(Ognl)