zoukankan      html  css  js  c++  java
  • struts2框架之OGNL(参考第三天学习笔记)

    ognl

    1. 什么是ognl
    对象图导航语言
    Struts内置的表达式语言,它比EL要强大很多。

    ------------------

    2. 单独学习ognl
    * EL它操作的数据来自于:四大域:pagecontext、request、session、application
    * ognl操作的数据来自于:ognl上下文对象,以及root对象

    OgnlContext它是一个Map,你不用对它有过多了解!

    OGNL表达式以“#”开头!
    OGNL表达式几乎与EL相同!

    ---------------------


    OGNL的JavaBean操作

    #emp.address.city,表示操作上下文中键为emp的javaBean,获取javabean的address属性的city属性。

    ---------------------

    ognl的根对象
    以"#"开头操作的是上下文中的对象:例如:#aaa.bbb,操作的是上下文中aaa这个对象
    不以"#"开头操作的是根对象,例如:aaa.bbb,操作的是根对象的aaa属性的bbb属性。

    ==========================

    ognl常量
    1. 字符串常量:使用单引或双引括起来的字符序列,但如果是一个字符,那么必须使用双引。'abc'、''、"a"、'bb'
    2. 字符常理:使用单引号括起来的单个字符
    3. 布尔常量:与java相同,即只有true和false
    4. null常量:与java相同
    5. 数值常量:1.0、100

    ----------------------

    ognl运算符

    1. ognl运算符与java中的运算符相似,大多数相同。 +、-、.....
    2. java中不存在的运算符:
    * 逗号运算符:多个表达式使用逗号分隔,形成大的表达式,就是逗号表达式。
    * 例如:1+2,2+3,4/2。从左到右依次运算所有表达式,整个表达式的值为最后一个表达式的值。
    * 大括号表达式:用来创建ArrayList对象的!{1,2,3,4}
    3. in和not in:判断当前值是否在集合中存在。
    * in和not都在OGNL中为关键字!!!

    4. 创建对象
    * new java.utild.Date(),创建对象语法

    -----------------------

    ognl调用方法

    1. 对象.方法(参数),例如:"'hello'.substring(1)",结果为ello

    -----------------------

    ognl操作静态的东西

    1. 静态方法:"@java.lang.Math@min(10, 20)"

    -----------------------

    投影和选择

    1. 向上下文中存放一个List
    cxt.put("empList" empList);
    2. 获取List中所有Emp对象的name属性值。(投影)
    可以理解为:select name from emp;,即单列查询
    #empList.{name} --> 它就是投影语法!

    选择
     #empList.{条件},可以理解为:select * from emp where 条件。

    三种语法:

    1. #empList.{? 条件}:它表示获取所有满足条件的对象
    2. #empList.{$ 条件}:它表示获取最后一个满足条件的对象
    3. #empList.{^ 条件}:它表示获取第一个满足条件的对象

     

    Struts中的OGNL

    1. Struts中的上下文对象和根对象
    ActionContext ac = ActionContext.getContext();
    Map cxt = ac.getContextMap();//获取上下文对象!
    甚至你都可以认为ActionContext就是Ognl上下文对象!

    通常我们不会获取它,而是通过ActionContext对象来间接操作上下文对象。

    根对象
    ActionContext ac = ActionContext.getContext();
    ValueStack vs = ac.getValueStack();//获取值栈,它就是根对象!

    它有push()用来压栈,还有pop()用来出栈

    2. ActionContext中的5个Map
    parameters:request.getParameterMap(),内容都是参数
    request:所有request.getAttribute(),对应的是request域,例如:#request.user.usernmae,相当于request.getAttribute("user").getUsername()
    session:session域
    application:application域
    attr:四大域, #attr.name,依次在四大域中查找,与EL的${name}

    3. ValueStack
    它是根对象,它也是一个集合。
    ValueStack中一般都存放着当前Action对象!

    ========================================

    在Struts中使用Ognl最多的地方是jsp页面,即在struts标签中!

    1. <s:property value="ognl表达式"/>,它的作用是输出!

    -------------

    (默认在Struts中静态操作是被禁用的!这需要使用一个常量来打开!)

    ========================================

    [N]语法

    <s:property value="[1].name"/>

    其中[1]表示一个子栈,从ValueStack的下标为1的元素开始,到栈底!
    其中[1].name,在子栈中查找name,那么第一个元素变成了下标1的元素,而不在是下标0。

    ========================================

    top语法

    <s:proeprty value="top"/> top表示栈顶对象

    以下没有区别,都是打印栈顶元素!
    proeprty标签的value属性默认值为top
    <s:proeprty/>
    <s:proeprty value="top"/>
    <s:proeprty value="[0].top"/>

    ========================================

    开户静态访问功能

    Struts中默认是不能访问静态方法和静态属性的,这需要通过配置一个常量来开户。
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />

    ========================================

    EL访问ValueStack
    pageContext, request(valuestack), session, application

    1. 访问request域,其实就是调用request.getAttribute()方法来获取!
    2. Struts对request进行了装饰!Struts对request的增强就是getAttribute()
    3. getAttribute()访问会先去找request域,如果找不到去ValueStack

    在EL访问request域时,调用的是getAttribute()方法,而这个方法先去request域找,没找到就去ValueStack去找,如果找到了,
    那么request.getAttribute()就返回有值了

    ========================================

    #、%、$

    # --> 当访问上下文中的数据时,以#开头!
    $ --> 在配置文件中使用ognl表达式,需要使用${...}
    % --> 有些struts标签不支付ognl,那么若想让它支付需要使用%{...}
    例如:<s:property value="name"/> property标签的value属性支持ognl表达式,但你也可以使用%{...},用了也白用!
    <s:property value="%{name}"/>,同上!

    例如:<s:hidden value="name"/> hidden标签的value属性不支持ognl表达式,那么如果想使用ognl必须使用%{...}
    <s:hidden value="%{name}"/>

    <s:xxx value="%{name}"/> --> 肯定是ognl
    <s:yyy value="%{'name'}"/> --> 肯定是字符串name

    ========================================

    Action向页面传递数据

    1. String数据
    this.addFieldError()
    this.addActionError()
    this.addActionMessage()

    <s:fielderror/>
    <s:actionerror/>
    <s:actioinmessage/>

    2. 复杂数据
    ActionContext.getContext().getValueStack().push(userList);
    页面使用循环标签来遍历

    ActionContext.getContext().getValueStack().push(user);
    页面可以使用<s:property/> 来取!

    <s:property value="username"/>
    <s:property value="password"/>

    --------------------------------

    class MyAction {
    private User user;

    public String execute() {
    this.user = service.findByUid("u_001");//把从数据库中查询到的对象保存到Action的属性中
    }
    }

    页面:
    <s:prooperty value="user.username"/>
    <s:prooperty value="user.password"/>

    --------------------------------

    <s:debug/>它会在页面中生成一个超链接,你点击它就可以看到上下文和值栈的内部结构!


  • 相关阅读:
    C语言I博客作业11
    第十四周助教总结
    C语言I博客作业10
    Tensorflow--MNIST简单全连接层分类
    记一些好看的Android开源菜单
    AS更新到3.5.2遇到ERROR: SSL peer shut down incorrectly问题
    Tensorflow tf.app.flags 的使用
    Android Sensor(传感器)
    《第一行代码》百分比布局出现的问题
    当Turtle遇见柯南?
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348779.html
Copyright © 2011-2022 走看看