zoukankan      html  css  js  c++  java
  • Struts2笔记3--OGNL

    一.OGNL入门
    1.简介
         OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某种表达式语法,存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。在struts2中,ognl表达式就是默认的表达式语言。


    2.使用要求
         (1)导入标签库
            

      1 <%@ taglib uri="/struts-tags" prefix="s" %>

         (2)与struts2标签配合使用
         (3)语法格式:
             完整写法:%{ongl表达式}
             简写:ongl表达式
         注:将ongl表达式加上单引号或双引号会将其变为字符串使用,如%{'OGNL表达式'}或者是%{"OGNL表达式"}/'OGNL表达式'或者是"OGNL表达式"


    3.struts2基本标签
         (1)基本输出
             <s:property value="OGNLExpression"/>:输出ognl表达式取到的内容;

        (2)调用普通方法
             长度:<s:property value="'OGNLExpression'.length()"/><br/>
             转大写:<s:property value="'OGNLExpression'.toUpperCase()"/><br/>
             分隔:<s:property value="'OGNLExpression'.split('E')"/><br/>

        (3)访问静态属性和静态方法:
         格式是:@包名.包名...类名@静态属性名称。这其中...的含义表示有几级包,就写几个包名。
             int的最大值:<s:property value="@java.lang.Integer@MAX_VALUE"/>
             随机数:<s:property value="@java.lang.Math@random()"/>
         注:调用静态属性或方法时,需修改配置文件:struts.xml,启用静态方法调用
             <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

        (4)在浏览器上创建一个单选迎铵钮
             //创建一个list集合
             <s:radio name="gender" list="{'男','女'}" label="性别"/>
             //创建一个map结构的list集合,该类型数据要求
             <s:radio name="gender" list="#{'male':'男','female':'女'}" label="性别"/>
         (5)用于开发阶段的标签,查看我们OGNL上下文中内容的标签
             <s:debug/>

        (6)获取大Map中的数据
             <s:property value="#contextMap"/>

        (7)获取key为application的map中的数据
             <s:property value="#application.applicationMap"/><br/>
             <s:property value="#application.applicationAttr"/>

        (8)获取值栈中的数据
         明确的事情:
             1、获取值栈中的数据,我们只能根据值栈中对象的property name获取property value。
             2、获取值栈中的数据,都是直接写属性名称,获取的就是值,并不需要使用任何符号。它是把value属性的取值作为值栈中对象的property name,在值栈中从栈顶逐个查找,只要找到了就返回结果,并且不再继续查找。
             3.默认的栈顶对象是:当前执行的动作类
             <s:property value="name"/><br/>
             <s:property value="age"/>

        (9)获取指定位置的对象中的属性值
             <s:property value="[0].name"/><br/>
             <s:property value="[1].name"/>

        (10)遍历标签
             <s:iterator value="customers" var="cust">
                 <TD><s:property value="#cust.custName"/></TD>
             </s:iterator>
             或
             <s:iterator value="customers">
                 <TD>${custName }</TD>
             </s:iterator>
             属性:
                 value:取值是一个OGNL表达式
                 var:写了该属性:var的值是一个字符串。他会把var的值作为key,把当前遍历的对象作为value,存入contextMap中;
                     没写该属性:把当前遍历的对象压栈,每次遍历结束后弹栈。
                 begin:遍历的开始索引
                 end:遍历的结束索引
                 step:遍历的步长
                 status:计数器对象
                 isOdd:是否是奇数行
                 isEven:是否是偶数行
                 isFirst:是否是第一行
                 isLast:是否是最后一行
                 getCount:获取当前遍历的个数 从1开始
                 getIndex:获取当前遍历的索引 从0开始


    4.OGNL上下文
         (1)ContextMap是struts2中封装数据最大的对象。我们一次请求中所有用到的信息都可以在它里面找到。它是一个Map结构的对象,其中key是字符串,value是一个Object。
         包含以下内容:

    contextMap包含的内容

        (2)ActionContext
             struts2提供的快速操作ContextMap的工具类,相当于对ContextMap进行了又一次封装,在每次请求访问Action时,即核心控制器(StrutsPrepareAndExecuteFilter)的doFilter方法执行时创建该对象;ActionContext是多例的,线程安全.
             使用ActionContext.getContext()方法即可获取其当前线程上的实例化对象


    5.与EL的比较
         a.EL表达式的写法:${表达式}。从四大域中,由小到大逐个域搜索,根据名称获取值。只要找到了,就不再继续搜索。
         b.EL原理:使用的是PageContext类中的findValue方法。
         C.Struts2框架中对EL表达式做了如下改变:
             EL表达式原来的搜素顺序:
                     page Scope——>request Scope——>sessionScope——>application Scope
             EL表达式改变后的搜索顺序:
                 page Scope—>request Scope—>valueStack—>contextMap—>sessionScope—>application Scope
         d.struts2框架对request对象进行了包装,并且对getAttribute方法进行了增强,


    6.各种符号的总结
         (1)#:
             a.获取大Map中数据,把后面的内容看成是key。
             b.在使用struts2标签,创建Map对象时使用。<s:radio list="#{}">
         (2)%:
             a.使用%{''}把OGNL表达式强制看成是普通字符串
             b.使用%{}把普通字符串强制看成是OGNL表达式
         (3)$:
             a.使用EL表达式的标识
             b.在struts的配置文件中使用OGNL表达式

  • 相关阅读:
    Leetcode: Increasing Triplet Subsequence
    Snapchat面经(师兄的)
    M面经prepare: Shuffle a deck
    M面经Prepare: Find integer Average of 2 integers.
    M面经Prepare: Positive-Negative partitioning preserving order
    M面经Prepare: Delete Words Starting With One Character
    Lintcode: Subtree
    Leetcode: Reconstruct Itinerary
    Groupon面经:Find paths in a binary tree summing to a target value
    一些小感悟(2014.04版)
  • 原文地址:https://www.cnblogs.com/huguangqin/p/7450313.html
Copyright © 2011-2022 走看看