1.值栈:
  • 解答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放入到值栈中
2.OGNL:
  • 概念:
    • 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方法
3.声明式的异常处理:
  • 配置:
    • exception-mapping元素:
      • 作用:配置当前action的声明式异常
      • 属性:
        • exception:指定需要捕获的异常类型,异常的全类名
        • result:指定一个响应结果,该结果将在捕获到指定异常时被执行,既可以来自当前action的声明,也可以来自global-results声明
    • 可以使用global-exception-mapping元素为应用程序提供一个全局性的异常捕获映射:
      • 缺陷:在exception-mapping中声明的异常映射,只能引用在global-results元素下生命的某个result
  • 处理机制:
    • 声明式异常处理机制有ExceptionMappingInterceptor拦截器负责处理,当有异常信息被捕获到时,拦截器就会向ValueStack中添加两个对象:
      • exception:表示被捕获异常的Exception对象
      • exceptionStack:包含着被捕获异常的栈
 

03_OGNL的更多相关文章

  1. 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 访问对象的方法 ...

随机推荐

  1. python--Selectors模块/队列

    Selectors模块/队列 一 Selectors模块 IO多路复用实现机制 Win: select Linux:select(效率低)  poll  epoll(最好)默认选择epoll sele ...

  2. digest-MD5认证

    digest-MD5认证机制是基于MD5算法的LINUX安全机制认证. 会比较用户端传送的杂凑值与使用者密码的杂凑值,以认证用户端. 但由于此机制必须读取使用者密码,因此,所有想透过digest-MD ...

  3. 六,前端---viewport

    移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,再具体一点,就是浏览器上用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区 ...

  4. 确认过眼神,你是喜欢Stream的人

    摘要:在学习Node的过程中,Stream流是常用的东东,在了解怎么使用它的同时,我们应该要深入了解它的具体实现.今天的主要带大家来写一写可读流的具体实现,就过来,就过来,上码啦! 码前准备 在写代码 ...

  5. Oracle12c功能增强新特性之维护&amp;升级&amp;恢复&amp;数据泵等

    1.   内容提要 1)   表分区维护的增强. 2)   数据库升级改善. 3)   跨网络还原/恢复数据文件. 4)   数据泵的增强. 5)   实时ADDM. 6)   并发统计信息收集. 2 ...

  6. [SCOI2016]幸运数字

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望 ...

  7. 李耀于NOIP2010集训出的题 Dvalue

    此题模型比较明显,求无向图的一棵生成树,使得最大边减去最小边的值最小,这是最小生成树的一个变式 设计出此题的算法需要利用Kruskal贪心的性质,首先枚举一条最小边,接着求原图的一棵最小生成树,根据k ...

  8. ●BZOJ 1531 [POI2005]Bank notes

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1531 题解: 单调队列优化多重背包DP (弱弱的我今天总算是把这个坑给填了...) 令V[i ...

  9. hdu2669与hdu1576(扩展欧几里德)

    模板: int Extend_Euclid(int a, int b, int &x, int &y){         if(b == 0){             x = 1; ...

  10. bzoj4487[Jsoi2015]染色问题 容斥+组合

    4487: [Jsoi2015]染色问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 127[Submit][Status ...