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>