03_OGNL
- 解答Struts能够直接获取属性值:
- 原因:Struts并不是直接通过request隐式对象中获取,而是将整个对象封装到了ValueStack值栈中,直接匹配是否存在这个属性,找到了就取出值,执行的先后顺序是从root根目录一层一层往下找。
- ValueStack详解:
- ValueStack对象的内部有两个逻辑部分:
- ObjectStack:
- Struts把Action和相关对象压入到ObjectStack中
- 实际上是一个OGNLContext类型,实际上也是一个Map,也是对ActionContext的一个引用
- ContextMap:
- Struts把各种映射关系(一些Map类型的对象)压入到ContextMap中,实际上就是对ActionContext的一个引用
- 实际上是一个CompoundRoot类型,是一个使用ArrayList定义的栈,里面保存着各种和Action实例相关的对象
- Struts会把以下对象压入到ContextMap中:
- parameters:该Map中包含当前请求的请求参数
- request:该Map中包含当前request对象中的所有属性
- session:该Map中包含当前session对象中的所有属性
- application:该Map中包含当前application对象中的所有属性
- attr:该Map按照如下属性来检索每个属性值:request、session、application
- 值栈中的属性值:
- 对象栈:对象栈中某个对象的属性值
- Map栈:request、session、application的一个属性值或一个请求参数的值
- Struts2自动将Action对象放入到值栈中
- 放入时间:
- Struts2终将调用Action类的Action方法,在调用该方法之前
- 先创建一个StrutsActionProxy对象
- 然后对其进行初始化,同时将Action放入到值栈中
- 概念:
- OGNL全拼:Object-GraphNavigationLanguage(对象导航图语言)
- 作用:用来访问值栈中的内容
- OGNL:
- 读取对象栈中的对象里的属性
- 读取方式:
- object.propertyName
- object['propertyName']
- object["propertyName"]
- ObjectStack里的对象可以通过从零开始的下标来引用
- ObjectStack里的栈顶对象通过[0]来引用下一个对象可以使用[1]来引用
- 若要访问其中的message属性值,则可以写为:
- [0].message]
- [0].['message']
- [0].["message"]
- 若在指定对象中没有找到该属性值,则会自动到下一个属性中搜索,[n]表示从第n个对象开始搜索,而不是搜索n个对象,若是从栈顶开始搜索则可以省略下标
- 默认情况下,Struts2会自动的将Action对象放到对象栈的栈顶
- 读取Map栈里的对象的属性:
- 读取方式:
- #object.propertyName
- #object['propertyName']
- #object["propertyName"]
- eg:读取session里面的name属性,#session.name
- property标签:Struts2利用s:property和OGNL表达式来读取值栈中的属性值
- 结合s:property属性读取对象栈里面的内容:<s:property value="[0].message" />
- OGNL其他作用:
- 调用任意一个Java类的静态字段或者方法
- 语法:
- @fullyQualifiedClassName@filedName@java.util.Calendar@DECEMBER
- @fullyQualifiedClassName@methodName(argumentList)@app4.Util@now()
- eg:
- 注意:一般情况下,此功能被struts2默认关闭,需要使用则需要打开
- 被封装到值栈的对象上的公共字段和方法
- 语法:
- object.fieldName:[0].datePattern
- object.methodName(argumentList) :[0].repeat(3,"hello")
- eg:
- 访问数组类型的属性:
- 用法:
- 有些属性将返回一个对象数组而不是单个对象,可以像读取其他对象属性一样读取它们,这种数组型属性的各个元素以逗号分隔,并且不带方括号
- 可以使用下标访问数组指定元素:colors[0]
- 可以调用其length字段来查看给定数组的元素个数:colors.length
- eg:
- 访问list类型的属性
- 用法:
- 有些属性将返回的类型是java.util.List类,可以像读取其他属性一样读取,这种list的各个元素是字符串,以逗号分隔,并且带方括号
- 可以通过下标访问
- 可以通过其size方法或者专属size字段来查看该list的长度
- 可以使用isEmpty方法或者专属isEmpty字段来判断其lsit是否为空
- 还可以使用OGNL来创建一个List,创建一个list与创建一个Java数组是相同的:{"red","green"}
- 访问Map类型的属性:
- 用法:
- 读取一个Map类型的属性会以此方式返回其所有键值对:{key1=value1,...,keyn=valuen}
- 若需要检索出某个map的值:map[key]
- 可以通过其size方法或者专属size字段来查看该map的键值对个数
- 可以使用isEmpty方法或者专属isEmpty字段来判断其map是否为空
- 可以用如下语法来创建一个map:#{key1=value1,...,keyn=valuen}
- eg:
- 使用EL访问值栈中的内容:
- 用法:使用${productName} 也可以达到<s:property value="productName">的效果
- 原理:Struts2将包装HttpServletRequest对象后的org.apache.struts.dispatcher.StrutsRequestWrapper对象传到页面上,并重写了其getAttribute方法
- 配置:
- exception-mapping元素:
- 作用:配置当前action的声明式异常
- 属性:
- exception:指定需要捕获的异常类型,异常的全类名
- result:指定一个响应结果,该结果将在捕获到指定异常时被执行,既可以来自当前action的声明,也可以来自global-results声明
- 可以使用global-exception-mapping元素为应用程序提供一个全局性的异常捕获映射:
- 缺陷:在exception-mapping中声明的异常映射,只能引用在global-results元素下生命的某个result
- 处理机制:
- 声明式异常处理机制有ExceptionMappingInterceptor拦截器负责处理,当有异常信息被捕获到时,拦截器就会向ValueStack中添加两个对象:
- exception:表示被捕获异常的Exception对象
- exceptionStack:包含着被捕获异常的栈
03_OGNL的更多相关文章
- Struts框架笔记03_OGNL表达式与值栈
目录 1. OGNL 1.1 OGNL概述 1.1 什么是OGNL 1.1.2 OGNL的优势 1.1.2 OGNL使用的要素 1.2 OGNL的Java环境入门[了解] 1.2.1 访问对象的方法 ...
随机推荐
- Tcl与Design Compiler (五)——综合库(时序库)和DC的设计对象
本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 前面一直说到综合库/工艺库这些东西,现在就来讲讲讲 ...
- poj 2945 Find the Clones
https://vjudge.net/problem/POJ-2945 题意: 给出n个长度相同的DNA序列,如果一个DNA序列出现过两次,那么就有说明它被复制了一次.问被复制0次,1次,2次--n- ...
- MySQL操作与修改表
插入数据(insert) insert语句的3个主要组成部分: 所要插入数据的表的名称: 表终需要使用的列的名称: 需要插入到列的值. 数字型主键生成机制 数字型主键生成机制,除了随机选择数字外,还可 ...
- 关于require.js的模块化开发
先是自己打了一些demo,然后回过头来看阮大神的博客,感觉很多莫名其妙的问题,瞬间解决了:很舒服,放上链接,希望对其他人也有帮助: 先是在html的末尾引入了require.js . da ...
- Spring基础复习
Spring IOC 使用注解实现Bean管理 注解类型: @Component:spring定义的通用注解,可用于注解任何bean @Repository, @Service,@Controller ...
- Java多线程之interrupt()的深度研究
近期学习Java多线程的中断机制,网上的帖子说得很浅,并没深究其原理.看了Java源码,对Java的中断机制有了略深入的理解,在这篇文章中向感兴趣的网友分享下.这篇文章主要通过一个典型例子对中断机制进 ...
- [LeetCode] Design Search Autocomplete System 设计搜索自动补全系统
Design a search autocomplete system for a search engine. Users may input a sentence (at least one wo ...
- promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解
* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...
- python包安装和使用机制
python语言的魅力之一就是大量的外置数据包,能够帮助使用者节省很多时间,提高效率.模块下载和引用是最常见的操作,现在解析内部的原理和背后发生的故事,做到心里有数. 导航: 基本定义 模块使用 模块 ...
- 分析 ajax 请求并抓取今日头条街拍美图
首先分析街拍图集的网页请求头部: 在 preview 选项卡我们可以找到 json 文件,分析 data 选项,找到我们要找到的图集地址 article_url: 选中其中一张图片,分析 json 请 ...