Struts(21)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具体解释的更多相关文章
- Struts 2 OGNL
1.什么是OGNL? 2.Struts 2 OGNL 表达式 ====================== 华丽丽的分割线 ====================== 1.什么是OG ...
- struts基于ognl的自动类型转换需要注意的地方
好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...
- struts的ognl.NoConversionPossible错误
JSP页面便利集合的时候,代码如下 <s:iterator value="storageList" id="stList" status="st ...
- struts与ognl结合【重要】
-----------------------------ognl表达式------------------------ OGNL:对象视图导航语言. ${user.addr.name} 这种写法就 ...
- java框架篇---struts之OGNL详解
OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...
- 关于struts中Ognl和iterator配合再次理解
Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...
- struts(三) ---OGNL的学习和理解
OGNL:Object graphic Navgation Language(对象图形的导航语言)
- 【SSH 基金会】SSH框架--struts进一步的详细解释(两)
继上篇博客 既然我们知道了不使用struts给我们带来这么多弊端,那么以下我们来看看struts是怎样封装的.怎么解决我们出现的问题的? 先来说一下struts的基本流程,帮助大家理解以下的代码: S ...
- 在Apache Struts中利用OGNL注入
前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...
随机推荐
- Comparator 与 Comparable
转载自 http://www.cnblogs.com/sunflower627/p/3158042.html 1. Comparator 和 Comparable 相同的地方 他们都是java的一个接 ...
- tensorflow学习笔记(一)安装
1.tensorflow介绍 中文社区地址 http://www.tensorfly.cn/ TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库. ...
- 【jQuery02】点击标题面板显示内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- LVM 镜像硬盘更换、数据恢复(centos7.4 redhat7.5)
案例说明 Centos7 VG:vg LV:vg-lvRedhat 7.5VG:vgtest LV:lvtest 目的:模拟硬盘 /dev/sdb损坏.在线添加新硬盘/dev/sdc,lv镜像数据 ...
- Docker yum 安装
[liwm@Eren ~]$ sudo su[root@Eren liwm]# yum install -y docker 已加载插件:fastestmirror, langpacks, prod ...
- thinkphp5 编辑时 唯一验证 解决办法
若定义了相关的验证规则,如: namespace app\seller\validate; use think\Validate; class Goodsmtag extends Validate { ...
- HNU 13108 Just Another Knapsack Problem DP + Trie树优化
题意: 给你一个文本串,和一些模式串,每个模式串都有一个价值,让你选一些模式串来组成文本串,使获得的价值最大.每个模式串不止能用一次. 思路: 多重背包,枚举文本串的每个位置和模式串,把该模式串拼接在 ...
- ZOJ 3365 Integer Numbers
Integer Numbers Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
- Qt之pro配置详解
简述 使用Qt的时候,我们经常会对pro进行一系列繁琐的配置,为方便大家理解.查找,现将常用的配置进行整理. 简述 配置 注释 CONFIG DEFINES DEPENDPATH DESTDIR FO ...
- 电源管理ACPI、及APM、GNU/Linux系统下的相应命令使用
/********************************************************************* * Author : Samson * Date ...