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

OGNL的Lambda表达式怎样工作呢?

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标签的使用。

Struts(21)OGNL具体解释的更多相关文章

  1. Struts 2 OGNL

    1.什么是OGNL? 2.Struts 2 OGNL 表达式      ======================  华丽丽的分割线  ======================  1.什么是OG ...

  2. struts基于ognl的自动类型转换需要注意的地方

    好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...

  3. struts的ognl.NoConversionPossible错误

    JSP页面便利集合的时候,代码如下 <s:iterator value="storageList" id="stList" status="st ...

  4. struts与ognl结合【重要】

    -----------------------------ognl表达式------------------------ OGNL:对象视图导航语言.  ${user.addr.name} 这种写法就 ...

  5. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  6. 关于struts中Ognl和iterator配合再次理解

    Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...

  7. struts(三) ---OGNL的学习和理解

    OGNL:Object graphic Navgation Language(对象图形的导航语言)

  8. 【SSH 基金会】SSH框架--struts进一步的详细解释(两)

    继上篇博客 既然我们知道了不使用struts给我们带来这么多弊端,那么以下我们来看看struts是怎样封装的.怎么解决我们出现的问题的? 先来说一下struts的基本流程,帮助大家理解以下的代码: S ...

  9. 在Apache Struts中利用OGNL注入

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

随机推荐

  1. POJ 2367 Genealogical tree【拓扑排序】

    题意:大概意思是--有一个家族聚集在一起,现在由家族里面的人讲话,辈分高的人先讲话.现在给出n,然后再给出n行数 第i行输入的数表示的意思是第i行的子孙是哪些数,然后这些数排在i的后面. 比如样例 5 ...

  2. day02变量

    一. 什么是变量? 变量:在程序运行过程中,值会发生变化的量.(与之相对应的,常量就是在程序运行过程中,值不会发生变化的量).无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值. 二 ...

  3. OSI概述问答

    1.    网络中体系结构的七层.四层.五层是怎么回事? OSI(Open System Interconnection)开放系统互连参考模型的七层协议体系结构:概念清楚,理论比较完整,但既复杂又不用 ...

  4. LVM 镜像硬盘更换、数据恢复(centos7.4 redhat7.5)

      案例说明 Centos7 VG:vg LV:vg-lvRedhat 7.5VG:vgtest LV:lvtest 目的:模拟硬盘 /dev/sdb损坏.在线添加新硬盘/dev/sdc,lv镜像数据 ...

  5. Docker学习总结(8)——利用Docker开启持续交付之路

    持续交付即Continuous Delivery,简称CD,随着DevOps的流行正越来越被传统企业所重视.持续交付讲求以短周期.小细粒度,自动化的方式频繁的交付软件,在这个过 程中要求开发.测试.用 ...

  6. 洛谷——P2863 [USACO06JAN]牛的舞会The Cow Prom

    https://www.luogu.org/problem/show?pid=2863#sub 题目描述 The N (2 <= N <= 10,000) cows are so exci ...

  7. 从一次生产事故说起——linux的单用户模式,救援模式等等

    伴随着今年linux上面最大一个安全漏洞bash漏洞的出现,我们公司也開始了风风火火的漏洞修复工作,机器一多,也就easy出问题,有台64位的linuxserver一不小心就升级了32位 bash 的 ...

  8. IDEA无法启动:Failed to create JVM:error code -4

    发生该错误的原因是由于IDEA须要使用的连续内存空间没有得到满足,解决方式: 1.减小-Xmx和-XX:PermSize的值     切换到IDE_HOME\bin\文件夹下,找到<produc ...

  9. 软件project之软件设计

    英雄是随着历史的时代产生的.软工也不例外.软件project这一门学科主要是为了解决当代软件危机而诞生的, 学习软件project的视频过后,最终让我揭开了它的神奇面纱,让我对软工设计有了一个初步的认 ...

  10. metasploit.meterpreter学习笔记(博主推荐)

    Metasploit学习笔记(博主推荐) 继续上面的博客 metasploit.meterpreter的基本使用: 首先来获取当前系统(即xp)下的正在运行的一些进程 获得进程之后,我们通过migra ...