Webwork【02】前端OGNL试练

1.OGNL 出现的意义

   在mvc中,数据是在各个层次之间进行流转是一个不争的事实。而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的:

a. 数据在页面上是一个扁平的,不带数据类型的字符串,无论你的数据结构有多复杂,数据类型有多丰富,到了展示的时候,全都一视同仁的成为字符串在页面上展现出来。

b. 数据在Java世界中可以表现为丰富的数据结构和数据类型,你可以自行定义你喜欢的类,在类与类之间进行继承、嵌套。我们通常会把这种模型称之为复杂的对象树。此时,如果数据在页面和Java世界中互相流转传递,就会显得不匹配。所以也就引出了几个需要解决的问题;

c. 当数据从View层传递到Controller层时,我们应该保证一个扁平而分散在各处的数据集合能以一定的规则设置到Java世界中的对象树中去。同时,能够聪明的进行由字符串类型到Java中各个类型的转化;

d. 当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进行访问。同时,在一定程度上控制对象树中的数据的显示格式。

     如果我们稍微深入一些来思考这个问题,我们就会发现,解决数据由于表现形式的不同而发生流转不匹配的问题对我们来说其实并不陌生。同样的问题会发生在Java世界与数据库世界中,面对这种对象与关系模型的不匹配,我们采用的 解决方法是使用ORM框架,例如Hibernate,iBatis等等。那么现在,在Web层同样也发生了不匹配,所以我们也需要使用一些工具来帮助我们解决问题。为了解决数据从View层传递到Controller层时的不匹配性,Struts2采纳XWork     的一套完美方案。并且在此的基础上,构建了一个完美的机制,从而比较完美的解决了数据流转中的不匹配性。OGNL方案就应运而生

2.OGNL项目实战

   OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,
遍历整个对象的结构图,实现字段类型转化等功能。

a. OGNL可以让我们用非常简单的表达式访问对象层【OGNL支持对Map的按键值查找】

<ww:property value='user.name' /> 可以直接点对象的属性,如user 属性是list,<ww:property value='user[0].name' /> 可以获取第一个user对象的 name如user 属性是一个 map <ww:property value='user[name]' /> 获取user "name" key 对应的 value

b. 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能

<ww:property value="100 - wcjd"/>

c. 支持对象方法调用,如xxx.doSomeSpecial()

d. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME

<ww:property value="#DateUtil.getNowdate(\"yyyy-MM-dd\")"/>

e. 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80

f .访问OGNL上下文(OGNL context)和ActionContext

g.你也可以通过任意类对象的构造函数进行对象新建

/**
new Java.net.URL("xxxxxx/")
**/

h.OGNL支持类似数据库中的投影(projection) 和选择(selection)。
投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。

/**
group.userList.{username}将获得某个group中的所有user的name的列表
**/ 

选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:
? 选择满足条件的所有元素
^ 选择满足条件的第一个元素
$ 选择满足条件的最后一个元素

/**
group.userList.{? #txxx.xxx != null}将获得某个group中user的name不为空的user的列表
**/

i. OGNL是通常要结合Struts 2的标志一起使用,主要是#、%和$这三个符号的使用。使用方法如下:

/**
访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameterValues("id").get(0);request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName")session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName")application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName")attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
用于过滤和投影(projecting)集合,
如books.{?#this.price<100};
构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。“$”有两个主要的用途,用于在国际化资源文件中,引用OGNL表达式。在Struts 2和i18n中配置文件/**

j. OGNL 可以获取后台 action get()set() 方法 传送过来的数据灵活展示到前台

转载于:https://www.cnblogs.com/java-class/p/5016578.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python ATM购物程序

需求&#xff1a; 模拟实现一个ATM 购物商城程序 额度 15000或自定义实现购物商城&#xff0c;买东西加入 购物车&#xff0c;调用信用卡接口结账可以提现&#xff0c;手续费5%每月22号出账单&#xff0c;每月10号为还款日&#xff0c;过期未还&#xff0c;按欠款总额 万分之5…

NYOJ 10 skiing

skiing 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;5描述Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获得速度&#xff0c;滑的区域必须向下倾斜&#xff0c;而且当你滑到坡底&#xff0c;你不得不再次走上坡或…

Spring的REST服务发现性,第5部分

这是有关使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web Service的系列文章的第五篇。 上一篇文章介绍了RESTful服务HATEOAS的可发现性的概念&#xff0c;然后介绍了一些由测试驱动的实际方案。 本文将重点介绍可发现性的实际实现以及使用Spring…

postman使用_postman如何使用集合断言?

在postman中&#xff0c;大家都使用过断言&#xff0c;但是我们使用的断言都是针对每一个接口或者是每一个用例添加的&#xff0c;那么是否有可以同时对多个用例或接口添加断言呢 &#xff1f; 答案是肯定有的。那么接下来我就带领大家认识下Postman中的批量断言&#xff0c;也…

纪念我的leetcode开门之旅

15.12.3在朋友的建议下开始了leetcode之旅&#xff0c;上面的题目先捡简单的刷吧。。。转载于:https://www.cnblogs.com/thewaytomakemiracle/p/5016825.html

NYOJ 16 矩形嵌套

矩形嵌套 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述有n个矩形&#xff0c;每个矩形可以用a,b来描述&#xff0c;表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d&#xff08;相当于旋转X90度&…

沉思滥用:“强力使用,破坏滥用”

英国前首相本杰明迪斯雷利&#xff08;Benjamin Disraeli&#xff09;曾有一个古老的说法&#xff0c;说谎言分为三种&#xff1a;“谎言&#xff0c;该死的谎言和统计数据”。 这里的暗示是统计数据很容易弥补它们是不可靠的。 但是&#xff0c;统计学在经验科学中得到了广泛的…

centos和ubuntu下使用cron设置定时任务

1.启动cron工具[ps:使用root权限] centos启动cron两种方式 a) /etc/init.d/crond start b) service crond start ubuntu启动cron两种方式 a) /etc/init.d/cron start b) service cron start(推荐) 2.添加定时任务[每个整点执行ls命令] centos crontab -e命令打开文件 添加一行:…

算法与数据结构(一)

这里的许多资源&#xff0c;有时间可用多看看&#xff0c;写一下。 http://download.csdn.net/album/detail/3249/2 这个哥们的博客还不错&#xff1a;http://u.cxyblog.com/2/articles-3.html转载于:https://www.cnblogs.com/oxspirt/p/5805409.html

protected访问权限_权限修饰符 /重写

一 权限修饰符 private内容不能被继承类:只有public / default 可以修饰 ,且default 默认出现protected访问权限1.同包下的类2.不同包的子类,只能通过子父类关系访问,只有子类中才可以使用.权限修饰符只能修饰成员,成员修饰符(成员变量|成员方法)二 重写重写和重载的区别:(都指…

NYOJ 26 孪生素数问题

孪生素数问题 时间限制&#xff1a;3000ms | 内存限制&#xff1a;65535KB难度&#xff1a;3描述写一个程序&#xff0c;找出给出素数范围内的所有孪生素数的组数。一般来说&#xff0c;孪生素数就是指两个素数距离为2&#xff0c;近的不能再近的相邻素数。有些童鞋一看到题就…

python importlib_importlib --- import 的实现 — Python 3.10.0a2 文档

3.7 新版功能.这个模块使得Python的导入系统提供了访问*包*内的*资源*的功能。如果能够导入一个包&#xff0c;那么就能够访问那个包里面的资源。资源可以以二进制或文本模式方式被打开或读取。资源非常类似于目录内部的文件&#xff0c;要牢记的是这仅仅是一个比喻。资源和包不…

原生js使用forEach()与jquery使用each遍历数组,return false 的区别

原生js使用forEach()与jquery使用each()遍历数组&#xff0c;return false 的区别&#xff1a; 1、使用each()遍历数组a,如下&#xff1a; var a[20,21,22,23,24];$.each(a, function(index,val) {console.log(indexindex);if(index2){return false;}console.log(valval);}); …

配置Java EE应用程序或“将Bien付诸实践”

过去&#xff0c;有关应用程序配置的讨论很多。 我不知道谁拉开了辩论的序幕&#xff0c;但是最基础的阅读&#xff08;着眼于未来的Java EE 7及更高版本&#xff09;是Antonio Goncalves的帖子[辩论] – Java EE 7中的配置如何 &#xff1f; 事实是&#xff0c;使用香草Java E…

HTML5 Canvas入门

HTML5的canvas&#xff08;画布&#xff09;元素使用JavaScript在网页上绘制图像。下面以一个简单例子及其效果图&#xff08;图1&#xff09;开始&#xff1a; <!DOCTYPE HTML> <html><head><style type"text/css"> canvas{border:dashed 2…

NYOJ 27 大数阶乘

大数阶乘 时间限制&#xff1a;3000ms | 内存限制&#xff1a;65535KB难度&#xff1a;3描述我们都知道如何计算一个数的阶乘&#xff0c;可是&#xff0c;如果这个数很大呢&#xff0c;我们该如何去计算它并输出它&#xff1f; 输入输入一个整数m(0<m<5000)输出输出m的…

泄漏:Oracle WebLogic Server 12g

JavaOne已经比我们落后了将近一个星期&#xff0c;我仍在撰写有关它的详细博客文章 。 我真的很惊讶的事实是&#xff0c;我没有看到任何提及我最喜欢的应用程序服务器更新的事实。 是的&#xff0c;我喜欢WebLogic产品。 从一开始。 自从收购BEA以来&#xff0c;甲骨文一直对我…

画家问题

【题目描述】 有一个正方形的墙&#xff0c;由N*N个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c;位置(i-1,j)、(i1,j)、(…

8-IO总结

3、 4、 5、 转载于:https://www.cnblogs.com/fubaizhaizhuren/p/5026207.html

NYOJ 36 最长公共子序列

最长公共子序列 时间限制&#xff1a;3000ms | 内存限制&#xff1a;65535KB难度&#xff1a;3描述咱们就不拐弯抹角了&#xff0c;如题&#xff0c;需要你做的就是写一个程序&#xff0c;得出最长公共子序列。tip&#xff1a;最长公共子序列也称作最长公共子串(不要求连续)&…