当前位置:编程学习 > JAVA >>

Struts2中的OGNL详解

首先了解下OGNL的概念:

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

此外,还得先需弄懂OGNL的一些知识:

 

1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。
 2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。
 3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

  4.值栈(ValueStack) :

可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
 
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
1.#符号

#符号的用途一般有三种。

—    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

—    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

$符号主要有两个方面的用途。

—    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—    在Struts 2框架的配置文件中引用OGNL表达式,例如: 

  1. <validators>    
  2.     <field name="intb">    
  3.             <field-validator type="int">    
  4.             <param name="min">10</param>    
  5.             <param name="max">100</param>    
  6.             <message>BAction-test校验:数字必须为${min}为${max}之间!</message>    
  7.         </field-validator>    
  8.     </field>    
  9. </validators>   

 

下面通过代码对OGNL有更深的了解:

action类OgnlAction.java: 
  1. package com.tjcyjd.test.action;  
  2.   
  3. import java.util.Date;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.http.HttpServletRequest;  
  8.   
  9. import org.apache.struts2.ServletActionContext;  
  10. import org.apache.struts2.convention.annotation.Action;  
  11. import org.apache.struts2.convention.annotation.Namespace;  
  12. import org.apache.struts2.convention.annotation.ParentPackage;  
  13. import org.apache.struts2.convention.annotation.Result;  
  14. import org.apache.struts2.convention.annotation.Results;  
  15. import org.springframework.stereotype.Controller;  
  16.   
  17. import com.opensymphony.xwork2.ActionContext;  
  18. import com.opensymphony.xwork2.ActionSupport;  
  19.   
  20. @Controller  
  21. @Namespace("/test")  
  22. @ParentPackage("struts-default")  
  23. @Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),  
  24.         @Result(name = "fail", location = "/bbs/admin_login.jsp"),  
  25.         @Result(name = "input", location = "/bbs/admin_login.jsp") })  
  26. public class OgnlAction extends ActionSupport {  
  27.     private static final long serialVersionUID = -1494290883433357310L;  
  28.     private List<Person> persons;  
  29.   
  30.     @Action("ognlTest")  
  31.     public String ognlTest() throws Exception {  
  32.         // 获得ActionContext实例,以便访问Servlet API  
  33.         ActionContext ctx = ActionContext.getContext();  
  34.         // 存入application  
  35.         ctx.getApplication().put("msg", "application信息");  
  36.         // 保存session  
  37.         ctx.getSession().put("msg", "seesion信息");  
  38.         // 保存request信息  
  39.         HttpServletRequest request = ServletActionContext.getRequest();  
  40.         request.setAttribute("msg", "request信息");  
  41.         // 为persons赋值  
  42.         persons = new LinkedList<Person>();  
  43.         Person person1 = new Person();  
  44.         person1.setName("pla1");  
  45.   &
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,