一.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。
     包含以下内容:

(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表达式

Struts2笔记3--OGNL的更多相关文章

  1. Struts2学习笔记四 OGNL

    OGNL,全称为Object-Graph Navigation Language(对象图表达语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,调用java对象的方法,同时能够自动 ...

  2. Struts2笔记3--获取ServletAPI和OGNL与值栈

    获取ServletAPI: 第一种方式: //在request域中放入属性req,暂且认为getContext()获取的是request域空间,但实际不是 ActionContext.getConte ...

  3. Struts2中使用OGNL

    链接:Struts标签库 OGNL(Object Graphic Navigatino Language) OGNL称为对象图导航语言.以一个对象为根(起点),通过OGNL可以访问与这个对象关联的其它 ...

  4. Struts2笔记——ONGL表达式语言

    OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言. ----------- ...

  5. 浅析Struts2中的OGNL和ValueStack

    要了解Struts2与OGNL表达式的关系,我们必须先搞清楚以下三个概念: 1.  ActionContext它是Action运行的上下文环境,Action的多项设置都存放在次,我们每一次Action ...

  6. Struts2笔记_值栈

    A.值栈概述 值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西.struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区 ...

  7. struts2框架之OGNL表达式概述(在代码中使用OGNL表达式)

    1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象 * 通 ...

  8. [转]STRUTS2中的OGNL

    OGNL表达式是(Object-Graph Navigation Language)是对象图形化导航语言.OGNL是一个开源的项目,struts2中默认使用OGNL表达式语言来显示数据.与serlve ...

  9. struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象

    struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象.临时对象.固定名称的对象.Action对象 解答:struts2的值栈排列顺序为:1).临时对象:2).模型对象:3).Ac ...

随机推荐

  1. CF1041F Ray in the tube

    挂上Chester大神的解题报告 有一个思维跳跃的地方,就是不应该枚举所有的$B$点,而是应该在选定一个$A$点之后枚举距离计算. 然后我们发现枚举距离是$2^k$的长度就可以了,证明如下: 假如距离 ...

  2. Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)

    解决办法,json数据只能用双引号,而不能用单引号

  3. ES Docs-2:Exploring ES cluster

    The REST API Now that we have our node (and cluster) up and running, the next step is to understand ...

  4. Linux系统及lvm知识

    一.磁盘分区是怎样表示的 IDE磁盘的设备文件采用/dev/hdx 来命名,分区则采用/dev/hdxy来命名,其中想表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推),与代表分区的号码(由1开始, ...

  5. Codeforces Round #523 (Div. 2)C(DP,数学)

    #include<bits/stdc++.h>using namespace std;long long a[100007];long long dp[1000007];const int ...

  6. CF17E Palisection(回文自动机)

    题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串 ...

  7. 洛谷P4287 [SHOI2011]双倍回文(回文自动机)

    传送门 听说有大佬用manacher$O(n)$过此题……太强啦…… 说一下PAM的做法吧.(看了题解之后发现)蛮简单的 我们肯定要先建出回文自动机的 然后如果是枚举每一个节点暴跳fail指针肯定得T ...

  8. [Xcode 实际操作]三、视图控制器-(10)在Storyboard中使用图像视图控件

    目录:[Swift]Xcode实际操作 本文将演示常用的图像视图控件在故事板中的使用. 打开故事板文件[Main.storyboard]点击选择视图控制器的根视图. 点击库图标,打开控件库面板. 在控 ...

  9. 解读人:李思奇,Development of a sensitive, scalable method for spatial, cell-type-resolved proteomics of the human brain. (一种用于研究人类大脑基于空间或细胞类型的蛋白质组学的灵敏方法)

    发表时间:(2019年4月) 一. 概述: 本文报道了一种可研究人类大脑组织中特定神经细胞的蛋白质组学的方法.作者通过激光捕获显微切割技术(LCM)从逝者大脑中分离出目的神经元细胞,接着尝试了一系列不 ...

  10. 课堂笔记 layout 布局、手风琴accordion、选项卡tabs

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...