2 相关技术介绍
2.1 MVC模式
MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应
用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率。在MVC模式中,应用程序被划分成模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式(页面、界面);而控制器部分负责协调模型和视图,根据用户请求来选择要调用哪个模型来处理业务,以及最终由哪个视图为用户做出应答。MVC模式的这三个部分的职责非常明确,而且相互分离,每个部分都可以独立的改变而不影响其他部分,大大提高了应用的灵活性和重用性。 2.1.1 MVC模式基础
在MVC模式中,一个应用被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分。
2.1.2 模型、视图、控制器各部分的作用
模型(Model):负责封装应用的状态,并实现应用的功能。通常分为数据模型
和业务逻辑模型,数据模型用来存放业务数据,比如订单信息、用户信息等;而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。
视图(View):用来将模型的内容展现给用户,用户可以通过视图来请求模型进行更新。视图从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互;用户在界面上操作或者填写完成后,会点击提交按钮或是以其它触发事件的方式,来向控制器发出请求。
控制器(Controller):用来控制应用程序的流程和处理视图所发出的请求。当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,也就是调用模型来实现用户请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户。 2.1.3 MVC模式作用
在早期开发的时候不遵守MVC模式。结果程序结构划分不明确,各个部分功能
第 6 页 共 42 页
混乱,在业务功能发生变更时,无论是业务逻辑修改还是显示形式修改,都要修改很多的类,“牵一发而动全身”,导致软件的开发和维护效率低下,错误百出。而遵循MVC模式来开发系统,就会极大的避免上述问题的出现。MVC模式的核心手段是解耦,MVC模式通过仔细的划分功能,把整个应用程序划分成模型、视图、控制器三个部分,然后严密控制三个部分之间的通信,从而得到一个结构清晰、功能分布合理、可重用、可扩展、可维护的应用程序。
因此,使用MVC模式,可以获得以下好处:
低耦合性:在MVC模式中,模型和视图是解耦的,模型不会依赖于视图,视图仅仅从模型中获取需要展示的数据,不会与模型的逻辑处理相关联。
更低的开发成本:MVC模式帮我们清楚的划分了各部分的职责,让程序员各司其职,Java程序员只关心业务逻辑的实现,也就是模型部分;而界面程序员只关心页面展示,也就是视图部分。
更好的可维护性:MVC模式划分出明晰的模型和视图,并使其解耦,在软件需求发生变更的时候,就可以各自独立的改变而不会相互影响,使得程序更容易维护和扩展。
2.2 轻量级Java EE开发平台:S2SH
轻量级JavaEE应用,以传统的JSP作为表现层技术,以系列来源框架作为MVC层、中间层、持久层解决方案,并将这些开源的框架有机地组合在一起,使得javaEE应用具有高度的可扩展性、可维护性。 2.2.1 Struts 2
Struts2是以Webwork的设计思想为核心的MVC框架。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度上来讲,Struts2没有继承Struts 1的血统,而是继承WebWork的血统。或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2.因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证。
通过对Struts2体系结构的了解,我们发现Struts2对Struts1进行了巨大的改进。主要表现在如下几个方面:
(1) 在Action的实现方面:Struts1要求必须统一扩展自Action类,而
第 7 页 共 42 页
Struts2中可以是一个普通的POJO。
(2) 线程模型方面:Struts1的Action工作在单例模式,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例。没有线程安全方面的问题。
(3) Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
(4) 封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
(5) 表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。
(6)绑定值到视图技术:Struts1使用标准的JSP,Struts2使用“ValueStack”技术。
(7) 类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。
(8) 数据校验:Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
(9) Action执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。 2.2.2 Hibernate
传统的Java应用都是采用JDBC来访问数据库的,但传统的JDBC采用的是一种基于SQL的操作方式,这种操作方式与Java语言的面向对象特征不太一致,所以Java EE应用需要一种技术,通过这种技术能让Java以面向对象的方法操作关系数据库。
这种特殊的技术就是ORM (Object Relation Mapping),最早的ORM是Entity EJB(Enterprise JavaBean),EJB就是经典Java EE应用的核心,从EJB l.0到EJB 2.X,许多人觉得EJB非常烦琐,所以导致EJB备受诟病。
在这种背景下,Hibernate框架应运而生,Hibernate框架是一种开源的、轻
第 8 页 共 42 页
量级的ORM框架,它允许将普通的、传统的Java对象(POJO)映射成持久化类,允许应用程序以面向对象的方式来操作POJO,而Hibernate框架则负责将这种操作转换成底层的SQL操作。
Sun公司引入了JPA规范。JPA规范其实是一种ORM规范,因此它的底层可以使用Hibernate、TopLink等任意一种ORM框架作为实现。很明显,如果应用程序面向JPA编程,将可以让应用程序既可利用Hibernate的持久层技术——因为可以用Hibernate作为实现:也可以让应用程序保持较好的可扩展性——因为可以在各种ORM技术之间自由切换。 2.2.3 Spring 3
Spring框架里充满了各种设计模式的应用,如单例模式、工厂模式、抽象工厂模式、命令模式、职责链模式、代理模式等,Spring框架的用法、源码则更是一道丰盛的Java大餐。
Spring框架号称Java EE应用的一站式解决方案,Spring本身提供了一个设计优良的MVC框架:SpringMVC,使用Spring框架则可直接使用该MVC框架。但实际上,Spring并未提供完整的持久层框架——这可以理解成一种“空”,但这种“空”正是Spring框架的魅力所在-Spring能与大部分持久层框架无缝整合:Hibernate,JPA,iBATIS,TopLink更甚至直接使用JDBC。无论选择哪种持久层框架,Spring都会提供无缝的整合以及极好的简化。Spring框架主要由7个定义良好的、相互独立的模块组件构成。 2.3 Jquery简介
jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多JavaScript高手加入其中,包括来自德国的Jrn Zaefferer,罗马尼亚的Stefan Petre等等。jQuery是继Prototype之后又一个优秀的JavaScript框架。其宗旨是——WRITE LESS,DO MORE,写更少的代码,做更多的事情。
使用jQuery有如下特点:
(1) 提供了强大的功能函数:使用jQuery提供的强大的函数库能够帮助我们快速完成各种功能, 而且会让我们的代码异常简洁。
(2) 解决浏览器兼容性问题:对于普通的JavaScript脚本往往是不同的浏览器需要编写不同的JavaScript脚本。有了jQuery我们就不需要再重复的编写
第 9 页 共 42 页
JavaScript代码了,因为jQuery对于各种浏览器是兼容的,使用jQuery并不需要考虑浏览器兼容性问题。
(3) 实现丰富的UI:jQuery为我们提供了界面美观且有兼容各种浏览器的各种UI,使用开发web页面更加容易。
(4) 丰富的插件:jQuery为我们提供了各种插件,使我们只要懂得jQuery基本语法就能够编写出漂亮的功能完善的Web页面。
第 10 页共 42 页