四合一做网站,四川建设网是国企吗,锦州网站制作,网站开发提高加载速度1.OGNL 出现的意义 在mvc中#xff0c;数据是在各个层次之间进行流转是一个不争的事实。而这种流转#xff0c;也就会面临一些困境#xff0c;这些困境#xff0c;是由于数据在不同世界中的表现形式不同而造成的#xff1a; a. 数据在页面上是一个扁平的#xff0c;不带数…1.OGNL 出现的意义 在mvc中数据是在各个层次之间进行流转是一个不争的事实。而这种流转也就会面临一些困境这些困境是由于数据在不同世界中的表现形式不同而造成的 a. 数据在页面上是一个扁平的不带数据类型的字符串无论你的数据结构有多复杂数据类型有多丰富到了展示的时候全都一视同仁的成为字符串在页面上展现出来。 b. 数据在Java世界中可以表现为丰富的数据结构和数据类型你可以自行定义你喜欢的类在类与类之间进行继承、嵌套。我们通常会把这种模型称之为复杂的对象树。此时如果数据在页面和Java世界中互相流转传递就会显得不匹配。所以也就引出了几个需要解决的问题; c. 当数据从View层传递到Controller层时我们应该保证一个扁平而分散在各处的数据集合能以一定的规则设置到Java世界中的对象树中去。同时能够聪明的进行由字符串类型到Java中各个类型的转化; d. 当数据从Controller层传递到View层时我们应该保证在View层能够以某些简易的规则对对象树进行访问。同时在一定程度上控制对象树中的数据的显示格式。 如果我们稍微深入一些来思考这个问题我们就会发现解决数据由于表现形式的不同而发生流转不匹配的问题对我们来说其实并不陌生。同样的问题会发生在Java世界与数据库世界中面对这种对象与关系模型的不匹配我们采用的 解决方法是使用ORM框架例如HibernateiBatis等等。那么现在在Web层同样也发生了不匹配所以我们也需要使用一些工具来帮助我们解决问题。为了解决数据从View层传递到Controller层时的不匹配性Struts2采纳XWork 的一套完美方案。并且在此的基础上构建了一个完美的机制从而比较完美的解决了数据流转中的不匹配性。OGNL方案就应运而生 2.OGNL项目实战 OGNL是Object-Graph Navigation Language的缩写它是一种功能强大的表达式语言通过它简单一致的表达式语法可以存取对象的任意属性调用对象的方法遍历整个对象的结构图实现字段类型转化等功能。 a. OGNL可以让我们用非常简单的表达式访问对象层【OGNL支持对Map的按键值查找】 ww:property valueuser.name / 可以直接点对象的属性如user 属性是listww:property valueuser[0].name / 可以获取第一个user对象的 name如user 属性是一个 map ww:property valueuser[name] / 获取user name key 对应的 value b. 支持运算符如-*/比普通的标志具有更高的自由度和更强的功能 ww:property value100 - wcjd/ c. 支持对象方法调用如xxx.doSomeSpecial() d. 支持类静态的方法调用和值访问表达式的格式为[类全名包括包路径][方法名 | 值名]例如java.lang.Stringformat(foo %s, bar)或tutorial.MyConstantAPP_NAME ww:property value#DateUtil.getNowdate(\yyyy-MM-dd\)/ e. 支持赋值操作和表达式串联如price100, discount0.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.price100}
构造Map如#{foo1:bar1, foo2:bar2}。%”符号的用途是在标志的属性为字符串类型时计算OGNL表达式的值。“$”有两个主要的用途用于在国际化资源文件中引用OGNL表达式。在Struts 2和i18n中配置文件/** j. OGNL 可以获取后台 action getset 方法 传送过来的数据灵活展示到前台转载于:https://www.cnblogs.com/java-class/p/5016578.html
相关文章: