Struts2之OGNL

OGNL:Object-Graph Navigation Language是一个用来获取 和设置 java对象属性的表达式语言。

 

OGNL Context:

OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象ValueStack。在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图

 

 访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session。另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可


ValueStack的结构:

在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象

                            |--request   

                           |--application   

      Context -----|--OgnlValueStack root变量[action, OgnlUtil, ... ]   

                           |--session   

                           |--attr   

                           |--parameters

 在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。

当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action 。然后把action存放进ValueStack(Struts2总是把当前Action实例放置在栈顶),所以action的实例变量可以被OGNL访问。

 

 

使用OGNL表达式:(实例)(尤其注意attr!!)

如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。

application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用ServletContext的getAttribute("username")。

session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。

request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName")。

parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。

attr对象:用于按page->request->session->application顺序访问其属性。

 

public class OgnlAction extends ActionSupport {  
    private static final long serialVersionUID = -1494290883433357310L;  
    private List<Person> persons;  
  
    @Action("ognlTest")  
    public String ognlTest() throws Exception {  
        // 获得ActionContext实例,以便访问Servlet API  
        ActionContext ctx = ActionContext.getContext();  
        // 存入application  
        ctx.getApplication().put("msg", "application信息");  
        // 保存session  
        ctx.getSession().put("msg", "seesion信息");  
        // 保存request信息  
        HttpServletRequest request = ServletActionContext.getRequest();  
        request.setAttribute("msg", "request信息");  
        // 为persons赋值  
        persons = new LinkedList<Person>();  
        Person person1 = new Person();  
        person1.setName("pla1");  
        person1.setAge(26);  
        person1.setBirthday(new Date());  
        persons.add(person1);  
  
        Person person2 = new Person();  
        person2.setName("pla2");  
        person2.setAge(36);  
        person2.setBirthday(new Date());  
        persons.add(person2);  
  
        Person person3 = new Person();  
        person3.setName("pla3");  
        person3.setAge(16);  
        person3.setBirthday(new Date());  
        persons.add(person3);  
  
        return SUCCESS;  
  
    }  
  
    public List<Person> getPersons() {  
        return persons;  
    }  
  
    public void setPersons(List<Person> persons) {  
        this.persons = persons;  
    }  
}  
jsp页面:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>    
    
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd">    
    
<html xmlns="http://www.w3.org/1999/xhtml">    
    
<head>    
    
    <title>Struts2 OGNL 演示</title>    
    
</head>    
    
<body>        
    
    <h3>访问OGNL上下文和Action上下文</h3>    
    
    <!-使用OGNL访问属性值-->    
    
    <p>parameters: <s:property value="#parameters.msg" /></p>    
    
    <p>request.msg: <s:property value="#request.msg" /></p>    
    
    <p>session.msg: <s:property value="#session.msg" /></p>    
    
    <p>application.msg: <s:property value="#application.msg" /></p>    
    
    <p>attr.msg: <s:property value="#attr.msg" /></p>    
    
    <hr />    
    
    <h3>用于过滤和投影(projecting)集合</h3>    
    
    <p>年龄大于20</p>    
    
    <ul>    
    
    <!-判断年龄-->    
    
        <s:iterator value="persons.{?#this.age>20}">    
    
            <li><s:property value="name" /> - 年龄:<s:property value="age" /></li>    
    
        </s:iterator>    
    
    </ul>    
    
    <p>姓名为pla1的年龄: <s:property value="persons.{?#this.name=='pla1'}.{age}[0]"/></p>    
</body>
</html>

至于关于struts的标签库,因为网上资料都还不错,就没有整理了。


作者注:好久没使用struts2了,最近要准备面试,忘得有点多了。但是网上的资料很混乱,于是自己结合着http://blog.csdn.net/tjcyjd/article/details/6850203以及之前自学的传智播客的关于Struts2教程的PPT发了这篇博客,希望能对大家有帮助。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值