一、什么是OGNL?在什么情况下使用OGNL?OGNL怎么使用?
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言。
1.可以访问ContextMap中的数据。
给OGNL表达式加上一个前缀字符#。如果没有前缀字符#,搜索将在ObjectStack里进行
2 .在JSP页面怎么访问ContextMap中的数据呢?
第一步:在JSP页面中引入struts2的标签文件,标签格式如下:
<%@taglib prefix="s" uri="/struts-tags" %>
第二步:结合<s:property>标签中的value属性读取ContextMap中的数据,如果开发人员要读某个具体数据建议把<s:debug></s:debug>标签导入进来方便查询值。格式如下:
<s:property value="#user.name"/> 读取用户对象的用户名
<s:property value="#user['name']> 读取用户对象的用户名
<s:property value="#user["name"]/> 读取用户对象的用户名
以上三种都是一个意思,可以根据个人喜好使用固定的方式,页面风格要统一。笔者习惯第一种方式
那么,不同请求域中如何获取呢?代码如下:
<s:property value="#session.code"/>返回session中的code属性
<s:property value="#request.code"/>返回request中的customer属性的name属性值
<s:property value="#attr.code"/>返回域对象(按request,session,application的顺序)的lastAccessDate属性
3.使用OGNL调用public类的public类型的静态字段和静态方法?
第一步:在struts.xml配置文件中添加一个常量设置,常量引用的名称是struts.ognl.allowStaticMethodAccess,其默认值是false(即关闭)。打开方式在package节点下添加一个常量子节点,形式如下:
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 打开静态方法调用的限制
注意:如果我们只调用public类型的静态字段是不需要第一步的。
第二步:使用OGNL怎么调用,具体格式如下:
1.调用静态字段
<s:property value="@java.lang.Math@PI"/>
2.调用静态方法
<s:property value="@java.lang.Math@cos(0)"/>
3.调用对象栈的方法为一个属性赋值
<s:property value="setProductName('atguigu')"/>
<s:property value="productName"/>
4.访问数组类型的属性,JSP页面中代码如下:
<%
string[] names = new String[] {"aa","bb"}
request.setAttribute("name",names);
%>
length:<s:property value="#attr.names.length" />
names[2]:<s:property value="#attr.names[1]"/>
5.使用OGNL访问Map,JSP页面代码如下:
<%
Map<String,String> letters = new HashMap<String,String>();
request.setAttribute("letters",letters)
letters.put("AA","a");
letters.put("BB","b");
letters.put("CC","c");
%>
<s:property value="#attr.letters.size"/>
<s:property value="attr.letters['AA']"/> 访问letters中名称为AA对应的值
6.访问值栈中对象的属性
<s:property value="fieldName">
也可以用EL表达式获取${fieldName}
二、关于OGNL与EL表达式的应用建议?
如果只单纯的获取某个值建议使用EL表达式,但是如果工程中引入了struts2框架的话,要想页面代码风格统一的话建议使用OGNL。