一、OGNL

  1.1、定义

    OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。它是一种功能强大的表达式语言,

    通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

  1.2、OGNL的功能

    1.2.1、支持普通方法的调用

      基础:<s:property value="">类似于jsp中的表达式(jsp表达式是<%= %>,el中的表达式是${}),把value的值直接输出到页面上

      value的属性值就是OGNL的表达式,注意它不是一个字符串。如果想把value中的值当作普通的字符串,请加引号。

      

      注意:el表达式只能调用静态的方法,而ognl可以访问普通方法就像上面的length方法

    1.2.2、访问静态成员(静态属性、静态方法)

        1.OGNL访问静态属性

          方式:@全类名@静态属性名称

          

              

        2.OGNL访问静态方法

          方式:@全类名@静态方法名

          

          注意:在struts2中,OGNL默认禁用静态方法,在default.properties中struts.ognl.allowStaticMethodAccess=false之控制,

            所以我们要在struts.xml中配置

          

          

    1.2.3、OGNL操作map和list集合

        

          

    1.3、OGNL的功能实现   

      1、存取对象的任意属性,简单说就是对javabean进行操作(重要)

      2、调用对象方法。

      3、调用类的静态方法

      4、索引数组元素

      5、操作集合(重 要)

    

    操作之前必须知道如何使用OGNL表达式,并且了解OGNL表达式的取值范围只能在其context和root中,格式为

         Ognl.getValue(expression,context,root);

         //expression:为我们编写的ognl表达式,从后两个参数中获取值,获取规则会从下面的例子中详细讲解

         //context:ognl的上下文,类型为map,

         //root:ognl的根,可以为javabean、list、map、.... 等等很多值

    

    1、对javabean进行操作

        User.java

            

        Address.java

            

        获取javabean中的属性值

            

        获取javabean中的对象的属性值

                

        对javabean中的属性进行赋值操作

            

         

        2、调用对象方法

             

        3、调用类的静态方法或属性

            

        

         4、索引数组元素

            

         5、操作集合

            操作list集合,list结合本质就是一个数组,所以从list中读取数据跟对数组的操作是一样的。

                  

            操作map集合

                  

            创建list集合

                  

            创建map集合

                  

二、ccontextMap(重点)

  2.1、动作类的生命周期

    明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的区别是,struts1的动作类是单例的。

  2.2、请求动作的数据存放    

  每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
  明确:
  在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
  这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。

  

  2.3、contextMap存储数据

  Struts2的官方文档对contextMap的说明:

    

  

  注意:除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)

  

  2.4、查看contextMap中的数据

  在jsp中引入struts2的核心标签库,然后使用<S:debug />   

  

  

    测试存入数据

    

    

三、contextMap中的数据操作

    

  3.1、存数据

    需要熟悉ActionContext和valueStackAPI.框架会为我们存数据

    3.1.1、使用ActionContext存数据

    

    在demo1.jsp点击dubug时

    

    3.1.2、使用ValueStack存数据

      

      结果:

        

    ValueStacj中的getRoot()方法

    

    CompoundRoot类是什么:

      

  在动作类中写一个栈操作

    

  3.2、取数据

    用Struts2的标签(OGNL表达式)在JSP上(用的最多)
    使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。

    3.2.1、取得contextMap中的数据,需要是要#

    使用s:property取数据

    

    在demo1.jsp中

    

  3.2.2、取ContextMap里面ValueStack中对象的属性:直接写属性名

    

    结果:

    

    如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置

  

  

  

  3.3、OGNL的使用总结

  取根中的对象属性不使用#

  取contextMap中的key的值,要使用#

  3.4、ValueStack的其他方法

    1.setValue()方法

  

  jsp中

     结果:

  在debug中

  

Stack Context

  2.set方法

    

  

    

  

    

        

      

      

  

Struts(五)之OGNL、contextMap的更多相关文章

  1. Struts中的OGNL和EL表达式笔记

    Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ...

  2. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用

    我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...

  3. Struts(十一):OGNL表达式(二)

    Map栈 :request,session,application的一个属性值或一个请求参数的值. 若想访问ContextMap里的某个对象的属性,可以使用以下几种之一: #object.proper ...

  4. Struts(十):OGNL表达式(一)

    Struts2 用s:porperty标签和OGNL表达式来读取值栈中的属性值: I.值栈中的属性值: 1.对象栈:读取对象栈中的某一个对象的属性值: 2.Map栈 :request,session, ...

  5. Struts 2 之 OGNL

    OGNL概述 Object-Graph Navigation Language,对象图导航语言 1.能够访问对象的方法,如list.size() 2.能够访问静态属性与静态方法,需要在类名前加上@,如 ...

  6. 在Apache Struts中利用OGNL注入

    前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...

  7. JavaWeb -- Struts 数据传输:OGNL和类型转换

    1. 数据传输:OGNL和类型转换 OGNL和struts2 OGNL:Object-Graph Navigation Language. OGNL是集成进struts框架中比较强大的技术有助于数据传 ...

  8. struts2学习笔记(五)—— OGNL

    一.OGNL概述 1.1 什么是OGNL OGNL的全称是对象图导航语言( object-graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可 ...

  9. Struts(五)

    前端和后端验证    1.前端:用户体验    2.保证程序的安全性    ================================验证框架========================== ...

随机推荐

  1. didReceiveMemoryWarning-内存警告处理方法-iOS

    前言 当app出现内存警告的时候会怎么办 正文 ios6.0之后,内存警告的viewDidUnload 被屏蔽,即又回到了ios3.0的时期的内存管理方式. iOS6.0及以上版本的内存警告:调用di ...

  2. CentOS 6.4 升级python 2.6.6 到 python 2.7.9

    1. 查看当前系统python的版本 python -V 2. 下载python软件包 cd /usr/local/src wget http://python.org/ftp/python/2.7. ...

  3. AngularJS2环境配置

    所使用到的文件目录结构如下所示: 1.      创建配置文件: 1.1.  创建目录: mkdir angular-quickstart cd angular-quickstart 1.2.  载入 ...

  4. 可能是一份没什么用的爬虫代理IP指南

    写在前面 做爬虫的小伙伴一般都绕不过代理IP这个问题. PS:如果还没遇到被封IP的场景,要不就是你量太小人家懒得理你,要不就是人家压根不在乎... 爬虫用户自己是没有能力维护一系列的代理服务器和代理 ...

  5. JAVA三大特性之二——继承

    很多人在学习了JAVA以后,都会了解这个概念,而且继承也会在以后的开发中经常用到,但对于JAVA的继承特性,很多人都了解的不够深入,不够完整,当然这其中包括我,所以我就想抽点时间来整理一下JAVA继承 ...

  6. 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)

    网上火热的“微软.NET年芳15”文章,我也得写点什么嘛,毕竟我还是现任的微软MVP. 摘录网上的“.NET 15周年”信息如下: 微软的 .NET 框架本周迎来了 15 岁生日..NET 的第一个版 ...

  7. Nginx支持Socket转发过程详解

    序言 一网友在群中问,nginx支持socket转发吗? 实话说,我没做过socket转发,但是我知道socket跟http一样都是通过tcp或者udp通信的,我猜测啦一下nginx应该支持吧,然后又 ...

  8. vue + socket.io实现一个简易聊天室

    vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...

  9. 使用咪咕云做C站视频直链源

    首先我们先百度搜索一下“咪咕云” 点击进入-->用户注册或登录 注册时选择个人用户-->前往邮箱激活-->进入邮箱激活成功后重新登录 登录后在控制台选择“云点播” 即可进行上传视频了 ...

  10. Omi应用md2site发布-markdown转网站利器

    写在前面 Md2site是基于Omi的一款Markdown转网站工具,使用简单,生成的文件轻巧,功能强大. 当我们想把一堆markdown文档转成网站时,你可能有许多选择,倘若选择 md2site , ...