爱问知识人 爱问教育 医院库

struts2 中OGNL访问根元素和非根元素有什么区别?

首页

struts2 中OGNL访问根元素和非根元素有什么区别?

如题,struts2 中OGNL访问根元素和非根元素有什么区别?

提交回答
好评回答
  • 2011-12-22 08:21:19
    根元素直接属性名就可以访问,最多加%{}就可以。
    非根元素则要加#
    希望对你有帮助。
    

    b***

    2011-12-22 08:21:19

其他答案

    2011-12-22 08:29:47
  •   Struts2中的标签大量用到了OGNL表达式,于是做了一番研究
        OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,OGNL是一个开源项目,可以访问其官方站点 以获得源代码和相关资料。
      OGNL是一种功能强大的EL(Expression Language,表达式语言),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。 OGNL先在WebWork项目中得到应用,也是Struts 2框架视图默认的表达式语言,可以说,OGNL表达式是Struts 2框架的特点之一。
       OGNL中主要有下面几个要点: A)String expression_r(OGNL表达式):表示“做什么” B) Object root(根对象):可以理解为OGNL的操作对象。在表达式规定了“做什么”以后,你还需要指定到底“对谁做” C) 有了表达式和根对象,我们实际上已经可以使用OGNL的基本功能。
      例如,根据表达式对根对象进行取值或者设值工作。不过通过上面的源代码我们看到,在OGNL的内部,所有的操作都会在一个特定的环境中运行,这个环境就是OGNL的上下文环境(Context)。这个上下文环境(Context),将规定OGNL的操作“在哪里做”。
      OGNL的上下文环境是一个Map结构,称之为OgnlContext 在struts2中,数据从View层传递到Controller层或者从Controller层到View层的时候,涉及到数据的存,取和类型转换的问题。Struts2采纳了XWork的OGNL方案。
      并且在OGNL的基础上,构建了 OGNLValueStack的机制,从而比较完美的解决了上面的问题。 看看Struts2 的官方文档中怎么说: 从上面的内容中,可以总结出: A) Struts2 中OGNL Context 中有多个根对象(也就是说上下文环境中有多个要操作的对象),上面图中已经标注出来了 application:用于访问ServletContext属性 session:用于访问HttpSession的属性 value stack: 上图中后面标注了一个root,表示它是OGNL上下文中的第一个根对象 request:用于访问HttpServletRequest的属性 parameters:用于访问HTTP请求参数 attr:访问范围中的值,依次搜索page范围,request范围,session范围,application范围 B) Value stack 是OGNL Context中的第一个根元素,可以直接使用表达式访问栈中的对象或者对象的元素。
      比如有一个OGNL表达式 : String exp=”name” ,那么OGNL 会从栈顶到栈底依次搜索每一个对象的name属性,以最先找到的为准。 C) 对于上下文中的其它对象(application,session,request,parameters,attr),要访问它们则必须在前面加上 “#”,而访问Value Stack是不用加”#”的相当于 tContext()。
      如: #parameters[‘userName’] = tParameter(“userName”) 取得请求参数userName的值 # er 或者#request[‘user’]= tAttribute(“user”) 取得request范围中的user对象 # er 或者#session[‘user’]= tAttribute(“user”) 取得session范围中的user对象 # er 或者#application[‘user’]= tAttribute(“user”) 取得application范围中的user对象 在OGNL表达式中 #的用法有三种: A:访问非根对象属性,例如示例中的# g表达式,由于Struts 2中 ValueStack被视为根对象,所以访问其他非根对象时,需要加#前缀。
      实际上 #相当于 tContext();#g表达式相当于tContext()。getSession()。getAttribute("msg")。 B:用于过滤和投影(projecting)集合,如示例中的persons。{?# e>20}。
       C:用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。 。

    l***

    2011-12-22 08:29:47

类似问题

换一换
  • 程序设计 相关知识

  • 电脑网络技术
  • 电脑网络

相关推荐

正在加载...

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):