简介
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。OGNL对象图导航语言,比EL表达式强大很多倍的语言,EL表达式只能从域中获取数据。OGNL可以调用对象的方法,获取struts的值栈的数据。OGNL是第三方的表达式语言,用它来获取struts中值栈的数据。支持运算符(如+-*/)支持对象方法调用,如xxx.doSomeSpecial();支持类静态的方法调用和值访问。支持赋值操作和表达式串联。访问OGNL上下文。操作集合对象。可以直接new一个对象。
使用
OGNL核心OgnlContext,本质就是一个map。两个对象分别为根对象(Root)、非根对象(Context对象)。
根对象(本质是个栈)
//写入
User user = new User(); user.setName("name");
OgnlContext ognlContext = new OgnlContext(); ognlContext.setRoot(user);
//直接读取
Object name = Ognl.getValue("name", ognlContext, ognlContext.getRoot());
System.out.println("name:" + name);
//调用方法
Object name = Ognl.getValue("'name'.length()", ognlContext, ognlContext.getRoot());
//调用静态方法
Object value = Ognl.getValue("@java.lang.Math@abs(-2)", ognlContext, ognlContext.getRoot());
写存根顶入:valueStack.getRoot().push();
弹出根顶:valueStack.getRoot().pop()
查看根顶:valueStack.getRoot().peek()
非根对象(存放一些request,session等请求)
//写入request ActionContext.getContext().put("reqName","reqValue"); //session ActionContext.getContext().getSession().put("sessionName","sessionValue"); //application ActionContext.getContext().getApplication().put("ApplicationName","ApplicationValue");
在JSP里面OGNL
配置xml <!--在jsp开启debug调试模式--> <constant name="struts.devMode" value="true" /> <!--在jsp允许实现静态方法--> <constant name="struts.ognl.allowStaticMethodAccess" value="true" /> jsp: <%--引入标签库--%> <%@ taglib uri="/struts-tags" prefix="s"%>
<%--调用方法--%> <s:property value="'123'.length()" />
<%--调用静态方法--%> <s:property value="@java.lang.Math@abs(-2)" />