【Struts】OGNL的基本使用

来源:互联网 发布:淘宝卖家采集器破解版 编辑:程序博客网 时间:2024/05/17 20:09
转自:  http://blog.csdn.net/qq_35448976/article/details/78011659
基本介绍
     OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取对象的任何属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能、它使用相同的表达式去存取对象的属性。

Struts2框架使用OGNL作为默认的表达式语言
  • OGNL是一种比EL强大很多倍的语言,支持对象方法调用,支持静态方法和字段访问,支持赋值操作等等。
  • xwork提供了OGNL表达式。
  • 其jar包为ognl-x.x.x.jar。

OGNL的要素
     OGNL有三大要素,分别是表达式、根对象、Context对象。

表达式
     表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次 OGNL 操作要做什么。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种"链式"对象访问路径,还支持在表达式中进行简单的计算。
     要想使用OGNL表达式来输出数据,需要借助struts2的标签实现。

根对象(Root)
     Root对象可以理解为OGNL的操作对象,表达式规定了"做什么",而Root对象则规定了"对谁操作"。OGNL称为对象图导航语 言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。

Context对象
     实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作在哪里进行。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"# "号加上对象名称,即#"对象名称"的形式。

思维导图


在Action中使用OGNL
[java] view plain copy
  1. // 访问对象的方法  
  2. @Test  
  3. public void run1() throws OgnlException{  
  4.     OgnlContext context = new OgnlContext();  
  5.     // 获取对象的方法  
  6.     Object obj = Ognl.getValue("'helloworld'.length()", context, context.getRoot());  
  7.     System.out.println(obj);  
  8. }  
  9.   
  10. // 获取OGNL上下文件的对象  
  11. @Test  
  12. public void run3() throws OgnlException{  
  13.     OgnlContext context = new OgnlContext();  
  14.     context.put("name""美美");  
  15.     // 获取对象的方法  
  16.     Object obj = Ognl.getValue("#name", context, context.getRoot());  
  17.     System.out.println(obj);  
  18. }  
  19.   
  20. // 从root栈获取值  
  21. @Test  
  22. public void demo3() throws OgnlException{  
  23.     OgnlContext context = new OgnlContext();  
  24.     Customer c = new Customer();  
  25.     c.setCust_name("haha");  
  26.     context.setRoot(c);  
  27.     String name = (String) Ognl.getValue("cust_name", context, context.getRoot());  
  28.     System.out.println(name);  
  29. }  

在页面中使用OGNL
     Struts2引入了OGNL表达式,主要是在JSP页面中获取值栈中的值。

使用步骤
  • 需要先引入Struts2的标签库
    • <%@ taglib prefix="s" uri="/struts-tags" %>
  • 使用Struts2提供的标签库中的标签
    • <s:property value="OGNL表达式"/>

案例
[html] view plain copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="/struts-tags" prefix="s" %>  
  3. <!DOCTYPE html>  
  4. <html>  
  5. <head>  
  6. <meta charset="UTF-8">  
  7. <title>OGNL表达式的最基本使用</title>  
  8. </head>  
  9. <body>  
  10. <%--1、输出一个字符串到浏览器上。  
  11.     需要借助于struts2的标签来输出  
  12.     <s:property value="" />它的作用就是把value属性的取值所对应的内容输出到浏览器上  
  13.     value属性取值是一个OGNL表达式  
  14.  --%>  
  15.  01.<s:property value="OGNLExpression"/>  
  16. <hr/>  
  17. <%--2、使用s:property标签把OGNLExpression输出到浏览器上  
  18.     把一个OGNL表达式强制看成是一个普通字符串:  
  19.         简单写法:用引号扩起来。到底使用单引号还是双引号是由外层引号决定的。  
  20.         标准写法:用%{''}或%{""}把表达式括起来,强制转成字符串。  
  21. --%>  
  22.     02.<s:property value='%{"OGNLExpression4"}'/>  
  23. <hr/>  
  24. <%--3、获取OGNLExpression字符串的长度。需要使用s:property标签  
  25.     OGNL表达式非常的灵活,他可以支持普通方法的调用。  
  26.  --%>  
  27.      03.<s:property value="'OGNLExpression'.length()"/>  
  28. <hr/>  
  29. <%--4、OGNL表达式支持访问静态成员:  
  30.     静态变量:  
  31.         书写要求:  @包名.包名..类名@属性名称  
  32.     静态方法:  
  33.         书写要求:  @包名.包名..类名@方法名称  
  34.         Struts2框架默认是不支持访问静态方法的。要想支持访问,需要开启。  
  35.         开启的方式就是在配置文件中配置。  
  36.         在struts.xml中配置  
  37.         <!-- 开启OGNL的静态方法访问 -->  
  38.         <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>  
  39. --%>  
  40.     04.<s:property value="@java.lang.Integer@MAX_VALUE"/><br/>  
  41.     05.<s:property value="@java.lang.Math@random()"/>  
  42. <hr/>  
  43. <%--5、OGNL表达式可以操作集合:List/Map --%>  
  44.     使用原始的表单输出一组性别的单选按钮:<br/>  
  45.     性别:<input type="radio" name="gender" value="男"/>男  
  46.          <input type="radio" name="gender" value="女"/>女  
  47.     <br/>  
  48.     使用struts2的表单标签输出一组性别单选按钮<br/>  
  49.     <%--s:radio标签的list属性取值是一个OGNL表达式。  
  50.         {}就相当于创建了一个集合:List gender = new ArrayList();  
  51.         {'男','女'}就相当于  
  52.                 gender.add("男");  
  53.                 gender.add("女");  
  54.         当服务器运行时,会把list的取值遍历生成<input type="radio"/>  
  55.     --%>  
  56.     <s:radio list="{'男','女'}" name="gender" label="性别"></s:radio>  
  57.     <hr/>  
  58.   
  59.     使用原始的表单输出一组性别的单选按钮:<br/>  
  60.     性别:<input type="radio" name="gender" value="male"/>男  
  61.          <input type="radio" name="gender" value="female"/>女  
  62.     <br/>  
  63.     使用struts2的表单标签输出一组性别单选按钮<br/>  
  64.     <%--#{'male':'男','female':'女'}就相当于创建了一个Map  
  65.         注意:  
  66.             使用OGNL创建map,必须是#{key:value,key:value}  
  67.     --%>  
  68.     <s:radio list="#{'male':'男','female':'女'}" name="gender" label="性别"></s:radio>  
  69. </body>  
  70. </html>  
原创粉丝点击