与MVC框架解耦的OGNL:前世今生及其基本用法.doc

上传人:bao****ty 文档编号:131487330 上传时间:2020-05-08 格式:DOC 页数:12 大小:157KB
返回 下载 相关 举报
与MVC框架解耦的OGNL:前世今生及其基本用法.doc_第1页
第1页 / 共12页
与MVC框架解耦的OGNL:前世今生及其基本用法.doc_第2页
第2页 / 共12页
与MVC框架解耦的OGNL:前世今生及其基本用法.doc_第3页
第3页 / 共12页
与MVC框架解耦的OGNL:前世今生及其基本用法.doc_第4页
第4页 / 共12页
与MVC框架解耦的OGNL:前世今生及其基本用法.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《与MVC框架解耦的OGNL:前世今生及其基本用法.doc》由会员分享,可在线阅读,更多相关《与MVC框架解耦的OGNL:前世今生及其基本用法.doc(12页珍藏版)》请在金锄头文库上搜索。

1、与MVC框架解耦的OGNL:前世今生及其基本用法一. OGNL 概述1、OGNL的前世今生WebWork是建立在称为XWork的Command模式框架之上的强大的基于Web的MVC框架。关于WebWork我们大多数人可能不太熟悉,最多只是有一种在哪里见过的感觉,但是我一提Struts2,估计大家就能想起来了。众所周知,Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全新框架。需要特别注意的是,全新的Struts2的体系结构与Struts1差别巨大,因为Struts2是以WebWork为核心的,继承了更多的WebWork血统。实际上,WebWo

2、rk 已经完全从Web层脱离出来的一个非常优秀的框架,其提供了很多核心的、Struts2还在使用的功能,包括前端拦截器(interceptor)、运行时表单属性验证、类型转换、IoC(Inversion of Control)容器等,其中就有我们今天的主角,强大的表达式语言 OGNL(Object Graph Notation Language)。2、OGNL 带给我们的实惠OGNL 是 Object Graph Navigation Language 的缩写,全称为 对象图导航语言,是一种功能强大的 表达式语言。它通过简单一致的语法,可以存取Java对象树中的任意属性、调用Java对象树的方

3、法,并能够自动实现必要的类型转化。更形象地说,如果我们把OGNL表达式看做是一个带有语义的字符串,那么OGNL无疑是这个语义字符串与Java对象之间沟通的桥梁。我们知道,在我们使用 MVC 架构模式进行开发Web应用时,数据往往需要在各层之间进行流转。由于数据在不同层次中的表现形式不尽相同,所以这种流转会很麻烦,特别是在Controller与View之间进行流转。实际上,数据在Controller层与View层之间流转的真正痛点就在于:数据在View层(视图页面)的表现形式是一个扁平的、不带任何数据类型的字符串,而在Controller层(Java世界)完全可以表现为一个具有丰富数据结构和数据

4、类型的Java对象,正是由于这种数据表现形式的差异,导致我们手工执行这种转换将是一项非常复杂、低效的工作。正因为如此,为了更好地解决数据在不同层之间的数据流转问题,作为一个优秀成熟的框架,Struts2 集成了 WebWork 中的 OGNL 来帮助我们解决个问题。因此,当我们在使用Struts2时,会发现OGNL充斥在前后台数据传递与存储的方方面面,也给我们带来了极大的方便。3、小结OGNL是模板语言的一个重要补充,对表现层技术而言是一次里程碑式的进步。在我们常见的视图组件,包括 Jsp 2.0,Velocity,Jelly 等,虽然都有类似的功能,比如,在 Jsp 2.0 中我们可以使用其

5、提供的 EL 表达式完成类似的功能。但是,OGNL比它们要完善的多得多,而且以一个独立的库文件出现,十分方便我们构建自己的框架。二. OGNL 深度解读:从一个例子说起我们在上文已经提到,OGNL 以一个独立的库文件出现,十分方便我们构建自己的框架。那么,我们首先新建一个Java Project,然后从Struts2的相关依赖包中导入 ognl-x.x.xx.jar (本人使用的struts-2.1.6中的ognl-2.6.11.jar),搭建完毕后项目结构如下:1、OGNL应用实例上述的Java Project包含两个JavaBean类和一个OGNL测试类,我们将围绕这个Project展开对

6、OGNL的介绍。我们先看一下该Project中各个类的源码:(1). 两个JavaBeanpackage cn.tju.edu.rico.test;import java.util.HashSet;import java.util.Set;/ Java Bean : Studentpublic class Student private College College; private String name; private String gentle; private double height; private int age; / 无参构造器 public Student() publ

7、ic Student(String name, int age, double height) super(); this.name = name; this.height = height; this.age = age; /getter & setter public College getCollege() return College; public void setCollege(College College) this.College = College; public String getName() return name; public void setName(Strin

8、g name) this.name = name; public String getGentle() return gentle; public void setGentle(String gentle) this.gentle = gentle; public double getHeight() return height; public void setHeight(double height) this.height = height; public int getAge() return age; public void setAge(int age) this.age = age

9、; Override public String toString() return Student name= + name + , height= + height + , age= + age + ; / Java Bean : Collegeclass College private String name; private Set Students = new HashSet(); / 无参构造器 public College() /getter & setter public String getName() return name; public void setName(Str

10、ing name) this.name = name; public Set getStudents() return Students; public void setStudents(Set Students) this.Students = Students; (2). OGNL测试类package cn.tju.edu.rico.test;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;public class OGNLTest public static void main(String args)

11、 throws OgnlException / 新建一个学校对象 College college = new College(); college.setName(TJU); / 新建一个学生对象 Student stu = new Student(); stu.setName(Rico); / 构建一个OgnlContext对象 ,并将上述学校、学生对象放入Ognl上下文环境(本质是一个Map)中 OgnlContext context = new OgnlContext(); context.put(ege, college); context.put(stu, stu); / 将学生设置

12、为根对象 context.setRoot(stu); / 构建Ognl表达式的树状表示 Object expression1 = Ognl.parseExpression(#college.name); Object expression2 = Ognl.parseExpression(name); Object expression3 = Ognl.parseExpression(#stu.name); / 根据Ognl表达式给Java对象设置值,将TJU改为NEU Ognl.setValue(expression1, context, context.getRoot(), NEU); / 根据Ognl表达式获取Java对象的(属性)值 Object collegeName = Ognl.getValue(expression1, context, context.getRoot(); Object stuName2 = Ognl .getValue(expression2, context, context.getRoot(); Object stuName3 = Ognl .getValue(expression3, context, context.getRoot(); System.out.println(collegeName);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号