zoukankan      html  css  js  c++  java
  • EL与OGNL以及值栈的理解

    这里先添加下在项目遇到的问题:

    这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到。

    困扰了许久:

    总结如下:

    (1)每个action对应相应页面的值栈中值的获取,在属于此action的页面上面如果采用OGNL或者EL表达式获取的值都是从此action中获取的。不要将action对应的页面搞乱了

    (2)关于EL表达式获取值栈中心的:map和对象栈stack中的值的获取方式:对于两者的获取方式都是${}这种方式,不分#的。

    (3)jsp页面的参数获取的形式:

        举个例子:

    对于struts标签内的OGNL表达式获取对象的值或者属性,比如user:前后什么都没有,是采用findValue()的查找顺序:它在值栈中的查找顺序是:先找stack(对象栈中一般model放最顶上,然后下面是action),再找map。

    #user,这种方式的取值是从map中获取值,只要有#的就从map中取。

    那么:struts的标签内部是这样获取的,那么EL表达式为什么也能获取到值栈中的值的呢?

    首先我们看下EL表达式的查询顺序:它是按照jsp作用域的由小到大查找的:page--request--session--application这个顺序。

    但是在struts2的对象栈中,如果想获取对象的值也是可以的,这是是struts2的功能强大之处:当使用了struts2之后,它对request对象进行重写,也就是说有了struts2,EL表达式的查找顺序也有所变化:

    page ---request----添加了findValue这个查找(即从值栈中获取值)----session----application

    这就是为什么我们在页面使用EL表达式也能获取值栈中的对象的值。

    总结添加:EL表达式可以用在普通的HTML标签内部。但是在struts2的标签内部(记住这是标签内部)只能用OGNL表达式或者加了#map中取或者不加#从stack中取。

                  如果用EL表达式,一般不用写struts的标签,即标签体和EL表达式分开使用。有Struts2的标签,就在内部使用OGNL表示。

    可以直接在html标签的标签体使用EL表达式。

       

    值栈问题:struts2的值栈分值和栈,即map类型的数据和存放在栈里面的数据。

    ModelDriven的源码:它会将model放在对象栈的栈顶。

    从上面,我们看到值栈里面存在着数据中心,里面有些页面传递过来的数据。作用范围:是一个请求,request

    那么如何从struts2的数据中心获取数据呢,即jsp页面如何获取这值栈里面的数据呢。

    jsp页面获取值栈中心的数据:利用OGNL或者EL表达式获取。

    OGNL表达式:

    获取map的数据用“#”

    OGNL的格式和语法:

    有时候如果是表达式的时候,可以不写%{}

    对象栈中有默认的搜索行为:所有有时候直接写对象栈中的属性即可,即从对象栈中获取:

     

    若我们从数据库中获取了数据,得向页面传送,这个时候,我们先将数据存放到值栈中,然后jsp页面再从值栈获取

     

     EL表达式:

    EL表达式用${}

    改为这个EL表达式的格式:数据也可以从值栈中获取;用的是struts2包装了的request对象

    封装的源码:

    查找顺序:

    request中找不到,就从值栈中找。

  • 相关阅读:
    Delphi编译器属性(特别修饰符Ref,Unsafe,Volatile,Weak)
    .netcore dapr微服务入门
    Net WebApi一个简单的Token验证
    发布订阅和观察者模式
    NET Core创建Windows服务
    jquery.barrager.js弹幕实现
    跨平台中的RN、Flutter,服务端GraphQL、Serverless,Node和Electron
    分布式系统与高并发高可用
    11 个 Linux 命令
    接口幂等性
  • 原文地址:https://www.cnblogs.com/fengli9998/p/6507036.html
Copyright © 2011-2022 走看看