OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
ognl的特点:
a、支持对象的方法调用,形式,eg:objName.methodName();
b、支持静态类的方法调用和值访问,expression:@【类全名(包括包路径)】@【方法名|值名】,eg:@tutorial.MyConstant@App_NAME;
c、支持赋值操作和表达式串联,eg:price=100,discount=80,calculatePrice()//返回80???
d、访问OGNL上下文(OGNL context)和ActionContext
e、操作集合对象
使用ognl表达式:
1)“#”符号有三种用途
a、访问非根对象(struts中值栈为根对象),eg:OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称 作用域
eg:
1-1)parameters :包含当前HTTP请求参数的Map
#parameters.id[0]=>作用相当于request.getParameter("id")
1-2)request:包含当前HttpServletRequest的属性(attribute)的Map
#request.userName=>作用相当于request.getAttribute("userName");
1-3)session:包含当前HttpSession属性(attribute)的Map
#session.userName=>session.getAttribute("userName");
1-4)application:包含当前应用的ServletContext的属性(attribute)的Map
#application.userName=>application.getAttribute("userName");
演示案例
public class ValueStackAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute(){ HttpServletRequest request=ServletActionContext.getRequest(); ValueStack vs=(ValueStack) request.getAttribute("struts.valueStack"); UserInfo info=new UserInfo(); info.setPassword("111"); info.setUsername("呵呵"); vs.getRoot().add(info); //vs.getContext().put("info",info); return SUCCESS; } }
页面运行结果:
可以看到确实获取到了Username的值
<%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> Welcome!!!! <s:debug></s:debug> <s:property value="username"/> </body>
OGNL 过滤与投影
Struts2 OGNL中的投影(过滤)
<s:property value="users.(?#this.age==1)"/>
获得是一个User的对象的一个集合
<s:property value="users.(?#this.age==1).{age}"/>
获得满足条件的这样一个集合中的age值;注意{age},花括号在OGNL中本身代表着
是一个集合
<s:property value="users.(?#this.age==1)[0]"/>
获得满足条件的这个集合的第一个元素
<s:property value="users.(^#this.age>1).{age}"/>
获得大于一的集合的元素里面,开头一个age值的集合
<s:property value="users.($#this.age>1).{age}"/>
获得大于一的集合的元素里面,结尾一个age值的集合
<s:property value="users.(^#this.age>1).{age} == null"/>
return false;