`
wjt276
  • 浏览: 650325 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Struts2 OGNL总结 OGNL访问静态成员-转

阅读更多

一直在写博客,但总是复制粘贴,现在发现的确有些东西还是需要自己去总结一下。

     最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然内容不多,但是确必须的精通,这是学习struts2的基础。

     Struts2 中内置了OGNL表达式的支持,使得Struts2的具有比Struts1更为强大的数据访问的功能。本文主要讲解OGNL的使用方法,并不会去讲解一些原理性的东西,想要了解的朋友可以自己去查阅相关的资料

     在OGNL的使用主要分以下部分来讲解:1.使用OGNL访问对象(不同范围的取值)

                                       2.OGNL的集合操作(OGNL元素符,以及过滤和投影功能)

                                       3.OGNL访问静态成员(怎么访问静态成员)

                                       4. lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结(在总结之后会详解Struts2的标签的使用)

 

一、使用OGNL访问对象

   1 读取struts2中的ValueStack中的值

     struts2中引入了ValueStack的概念,在struts2中默认使用ValueStack作为OGNL的StackContext的根元素

   OGNL在读取根元素的时候能够直接进行读取

     假设action中有

     private Cat cat;  private Dog dog; 俩个对象,那么在jsp页面读取方法就是

    <s:property value="cat.name"/>  读取Cat的name属性的值

    <s:property value="dog.name"/>  读取Dog的name属性值

   2 使用#读取parameters  request  session  application 范围内的值()
     <s:property value="#request.id"/>  相当于 request.getAttribute("id")

     <s:property value="#parameters.id"/>  相当于 request.getParameter("id")

     <s:property value="#session.id"/>  相当于 session.getAttribute("id")

     <s:property value="#application.id"/>  相当于 application.getAttribute("id")

     <s:property value="#attr.id"/>   依次搜索PageContext HttpServletRequest   HttpSession  ServletContext 范围 ,查找属性,找到为止
二、OGNL的集合操作

   1 创建一个集合

    {e1,e2,e3} 直接创建一个List类型的集合

    #{Key1:Value1,Key2:Value2} 构建一个Map类型的集合

    使用: <s:set name="sex" value="#{'1':'男','2':'女'}"/>

         <s:property value="#sex[id]"/>  在ValueStack范围内找到id的值, 并用它作为key去查找对应的

                                         value 并显示出来   

   2 OGNL元素符 

     对于集合,OGNL提供了两个元素符:in和not in,其中in判断某个元素是否在指定集合中;not in则用于

    判断某个元素是否不在指定集合中。

    判断一个对象是否在List内存在:

   <s:if test="'foo' in {'foo','bar'}">

      muhahaha

   </s:if>

   <s:else>

      boo

   </s:else>

 

   <s:if test="'foo' not in {'foo','bar'}">

      muhahaha

   </s:if>

   <s:else>

      boo

   </s:else>

   3 过滤与投影集合

     假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象

 

      我们可以通过这样进行过滤取值

     <s:iterator value="books.{?#this.price>35}"> 这样只会取到价格大于35的书籍,很好的起到了过滤的

     作用,

     ?取出所有符合逻辑的元素

     ^ 取出符合逻辑的第一个元素

     $ 取出符合逻辑的最后一个元素

三、OGNL访问静态成员

    在实际的开发中像页面的参数传递是绝对拒绝使用硬编码的,最好的解决方式有2种:一种是写在国际化配置文件中;另外的一种就是建立一个类,专门维护静态成员,所有硬编码的地方都调用它就可以了。

    struts2 中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置

   <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

   设置之后就可以用以下的表达式来访问静态成员了。

  1 访问静态方法

     <s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>

  2 访问静态常量

     <s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>

四、lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结

   1 lambda表达式

     这个表达式,我其实也很少去用,这里给大家拿个例子讲解一下吧

     <s:property value="#conv =:[#this==1?'男':#this==2?'女':''], #conv(1)" />

     这句的作用就是,value="#conv =:   定义一个函数 conv

     [#this==1?'男'       定义 conv(1)=男

     #this==2?'女'        定义 conv(2)=女

     当然这个只是一个简单的例子,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体讲解,引用别人的一个例子

   

例如:

Fibonacci:

if n==0 return 0;

elseif n==1 return 1;

else return fib(n-2)+fib(n-1);

fib(0) = 0

fib(1) = 1

fib(11) = 89

 

OGNLLambda表达式如何工作呢?

Lambda表达式必须放在方括号内部,#this表示表达式的参数。例如:

<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />

 

#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)]定义了一个Lambda表达式,

#fib(11) 调用了这个表达式。

   2 总结

     这里主要讲解一下使用注意事项

     <s:url value="#foobar['foo1']">   如果你这样使用标签 ,那么它绝对不会是你想要的,它会按照你的

                                       输入原样的输出的  #foobar['foo1']

    正确的使用:   <s:url value="%{#foobar['foo1']}">   %{} 用于对括号内用ognl求值

    struts2的action,大家都习惯了生成get与set方法,其实新版的没有这俩个方法也能插值进去的,它采用了java的反射机制来实现,不过官方还是建议按照旧的方法用。

   这一节就先到这里,本人能力有限难免会有纰漏,欢迎指教,过几天放出本人总结的struts2标签的使用。

分享到:
评论

相关推荐

    很全面的struts2_ognl总结

    Struts2 OGNL 表达式总结 OGNL(Object-Graph Navigation Language)是一种基于 Java 的表达式语言,Struts2 框架中使用 OGNL 来访问和操作 ValueStack 中的对象。在 Struts2 中,OGNL 是一个强大的工具,允许...

    Struts2_OGNL

    例如,struts.ognl.allowStaticMethodAccess常量设置为true时,OGNL将能够访问静态方法和属性。 在掌握Struts2和OGNL的基础上,开发者可以进一步学习Struts2的其他组件和特性,如标签库、异常处理、国际化支持、...

    struts2 OGNL语言学习笔记

    在 Struts 2 中,OGNL 是默认的表达式语言,原因是它相对其它表达式语言具有多个优势,例如:支持对象方法调用、支持类静态的方法调用和值访问、支持赋值操作和表达式串联等。 在使用 OGNL 时,经常遇到的问题是 #...

    struts2 OGNL表达式使用

    OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的普通属性: 2. 访问值栈中...

    struts2 ognl表达式

    Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...

    struts2 标签 OGNL

    在Struts2中,OGNL被广泛用于访问Action中的属性,以及在视图层(如JSP)中绑定和操作数据。 首先,OGNL使得访问对象属性变得非常直观。它支持点符号(.)和方括号([''])两种方式来访问属性。例如,如果在Action...

    struts2_OGNL Demo

    OGNL表达式语言是Struts2的核心特性之一,它允许开发者在Action类和JSP页面之间灵活地访问和修改对象的属性。例如,`&lt;s:textfield name="username" /&gt;`标签会将表单中的“username”字段值绑定到Action类的相应属性...

    struts2中的ognl

    在Struts2中,OGNL被广泛用于访问和操作应用程序中的对象属性,包括在请求、参数、session、application上下文中的数据。 1. **访问数据上下文**: - 在Struts2中,使用`#`符号可以访问特定的数据上下文,如`...

    struts2 ognl

    这篇概述将深入探讨如何在Struts2中使用OGNL来操作List、Set、Map以及访问方法和静态变量。 1. **OGNL基本概念**:OGNL是基于对象和图形的表达式语言,它允许开发者以简洁的语法动态地访问和修改对象属性。在Struts...

    Struts2 OGNL调用公共静态方法详细介绍

    一直以来都知道Struts2的OGNL支持在前台调用后台的静态方法,以前也用过,但用的比较少,今天自己重新开始了一个新的项目,在实现一个功能的时候用到了Struts2的在前台调用后台的静态方法,弄了半天没有出来结果,...

    struts2中OGNL的一些概念及原理说明

    ### Struts2中OGNL的概念及原理说明 #### 一、OGNL表达式的基本用法与特点 **OGNL**,即**Object Graphic Navigation Language**(对象图导航语言),是Struts2框架中用于处理对象及其属性的强大工具之一。通过...

    Struts2的标签库及OGNL表达式语言

    Struts2是一个流行的Java web开发框架,其核心特性之一就是使用OGNL(Object-Graph Navigation Language)作为表达式语言,并提供了丰富的标签库来简化视图层的开发。本篇文章将详细探讨Struts2中的OGNL表达式语言...

    精通struts2的ognl表达式

    - 在Struts2中,可以使用OGNL来访问ValueStack中的值。ValueStack是Struts2的核心组件之一,用于存储请求期间的数据。 - 例如,可以通过`&lt;s:property value="cat.name"/&gt;`来获取Cat对象的name属性值。 - 使用`#`...

    Struts 2中的OGNL教程

    2. **支持类静态的方法调用和值访问**:可以通过特定格式(`@[类全名(包括包路径)]@[方法名|值名]`)访问静态方法或常量,例如 `@java.lang.String@format('foo%s', 'bar')` 或 `@tutorial.MyConstant@APP_NAME`。...

    Struts2_OGNL 笔记

    OGNL作为一种强大的表达式语言,常用于Struts2的视图层,允许开发者轻松地访问和操作Java对象的属性。 1. OGNL的基本概念: OGNL是Struts2中的默认表达式语言,它提供了简洁的语法来访问和修改对象的属性。例如,`...

    ognl struts2

    3. 开启严格模式:在Struts2配置中启用`struts.ognl.allowStaticMethodAccess`为`false`,限制静态方法的调用。 4. 使用最新版本:定期更新Struts2框架,以获取最新的安全补丁。 总结,OGNL在Struts2框架中起着至关...

    struts2-scan_struts2-scan_struts2scan_scan_struts2漏洞_

    在使用"struts2-scan.py"这个Python脚本时,你需要确保你有相应的环境支持Python运行,并且对目标Struts2应用有一定的访问权限。通常,这个脚本会遍历一系列的漏洞测试用例,针对每个可能的漏洞进行探测。扫描完成后...

    struts2_ognl基本用法.doc

    OGNL(Object-Graph Navigation Language)是Struts2框架中用于访问和操作Java对象的一种强大表达式语言。在Struts2中,OGNL主要用于访问值栈中的数据,包括Action实例以及它所包含的对象属性。 **1. 访问Action的...

Global site tag (gtag.js) - Google Analytics