OGNL
是Object-Graph Navigation Language的缩写,全称为对象图导航语言,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
OGNL表达式的基本单位是"导航链",一般导航链由如下几个部分组成:
- 属性名称(property)
- 方法调用(method invoke)
- 数组元素
Struts 2支持以下几种表达式语言:
1.OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2.JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3.Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4.Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2支持以下几种表达式语言:
1.OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2.JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3.Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4.Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
> 若想访问 Object Stack 里的某个对象的属性. 可以使用以下几种形式之一:
<s:property value="object.propertyName"/>
> ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,
它下面的那个对象可以用 [1] 引用.
<s:property value="[0].productDesc"/> //从栈顶开始搜索对象属性
> [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象
> 若从栈顶对象开始搜索, 则可以省略下标部分: message
> 结合 s:property 标签:
2). 默认情况下, Action 对象会被 Struts2 自动的放到值栈的栈顶.
<result name="save">/ognlTag/details.jsp</result>
System.out.println("asdasdsadasd");
// 1.获取值栈信息
ValueStack valueStack = ActionContext.getContext().getValueStack();
// 2.设置属性
Test test = new Test();
test.setProductName("AAAAA");
test.setProductDesc("BBBBB");
// 3.把信息压入值栈顶部
valueStack.push(test);
return "save";
}
<s:debug></s:debug>
<br><br>
productName: ^<s:property value="productName"/>
<br><br>
productDesc: ^<s:property value="productDesc"/>
<br><br>
<hr>
productName: ^^<s:property value="[1].productName"/>
<br><br>
productDesc: ^^<s:property value="[1].productDesc"/>
<br><br>
productPrice:^^<s:property value="productPrice"/>
<br><br>
<hr>
productPrice:${productName}
<br><br>
productPrice:${productDesc}
<br><br>
productPrice:${productPrice}
<br><br>
</body>
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public String execute(){
request.put("request", "AASSS");
session.put("session", "英雄联盟");
application.put("application", "app穿越");
return "success";
}
}
<action name="input_Map" class="com.struts.OGNLtag.map.Product" method="execute">
<result name="success">/OGNLMap/detais.jsp</result>
</action>
<br><br>
<!-- 使用EL表达式 -->
request:${requestScope.request}
<br><br>
session:${sessionScope.session}
<br><br>
application:${applicationScope.application}
<br><hr><br>
<!--访问值栈中 ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符 #.
如果没有前缀字符 #, 搜索将在 ObjectStack 里进行. -->
request:^^<s:property value="#request.request"/>
<br><br>
session:^^<s:property value="#session.session"/>
<br><br>
application:^^<s:property value="#application.application"/>
</body>
3.Struts2中使用OGNL表达式访问静态属性和方法
1.访问静态方法:@包.类名@方法名(),如:@cn.edu.ahau.mgc.struts2.model.Magci@method();
2.访问静态属性:@包.类名@属性名,如:
@cn.edu.ahau.mgc.struts2.model.Magci@NAME
3.第一个@后面的类可以省略,默认为Math类,如:
@@floor(1.32342);
4.访问静态方法必须在struts.xml文件中添加如下配置:(注意:不配置,调用方法就使用不了)
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
调用值栈中对象的普通方法:<s:property value="user.get()"/><br> |
访问静态属性和方法
调用Action中的静态方法:<s:property value="@struts.action.LoginAction@get()"/> 调用JDK中的类的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br> 调用JDK中的类的静态方法(同上):<s:property value="@@floor(44.56)"/><br> 调用JDK中的类的静态方法:<s:property value="@java.util.Calendar@getInstance()"/><br> 调用普通类中的静态属性:<s:property value="@struts.vo.Address@TIPS"/><br> |
访问构造方法
调用普通类的构造方法:<s:property value="new struts.vo.Student('李晓红' , '美女' , 3 , 25).username"/>
|
String[] names = new String[]{"AA","CC","FF","DD"};
request.setAttribute("names",names);
%>
<br><br>
获取数组长度:<s:property value="#attr.names.length"/>
<br><br>
获取数组值:<s:property value="#attr.names[2]"/>
OGNL中的#号可以取出堆栈上下文中存放的对象
名称 | 作用 | 例子 |
attr | 用于按request>>session>>application顺序访问其属性 | #attr.userName相当于按顺序从三个范围读取userName属性直 到找到为止 |
request | 包含当前HttpServletRequest的属性的Map | #request.userName相当于request.getAttribute("userName") |
session | 包含当前HttpSession的属性的Map | #session.userName相当于session.getAttribute("userName") |
application | 包含当前应用的ServletContext的属性的Map | #application.userName相当于application.getAttribute("userName") |
parameters | 包含当前HTTP请求参数的Map | #parameters.id[0]相当于request.getParameter |
<s:property value="list[0]"/> <!--访问下标为0的元素 -->
<s:property value="list[0].name"/> <!-- 访问第一个元素的属性 -->
<s:property value="list.isEmpty()"/> <!-- 获取集合是否为空 -->
<s:property value="map['s1']"/> <!-- 获取key为s1的值 -->
<s:property value="map.s1"/> <!-- 获取key为s1的值 -->
<s:property value="map.keys"/> <!-- 获取map的键集合 -->
<s:property value="map.values"/> <!-- 获取map的值集合 -->
<s:property value="map.size()" /> <!-- 获取map的键值对数量 -->
<s:property value="map.isEmpty()"/> <!-- 获取map是否为空 -->
<s:property value="set.toArray()[0]"/> <!-- 转化数组,拿第一个元素 -->
<s:property value="set.size()"/> <!-- 获取set的大小 -->
<s:property value="set.isEmpty()"/> <!-- 获取set是否为空 -->