MVC思想概述:
如今见到的大部分应用都是基于B/S(浏览器/服务器)架构的,其中服务器就是Web服务器。可见,Web应用是目前广泛使用的应用模式,而Struts 2是一个具有很好的使用价值的Web MVC框架。在介绍Struts 2之前,我们先简单了解Web应用的发展历史和MVC思想。
Web技术发展历程:
(1) 早期的Web应用全部是静态的HTML页面(特点: 将固定的文本信息呈现给浏览者,不具备与用户交互的能力,无动态显示功能);
(2) CGI(通用网关接口)技术(优势: 使得Web应用可以与客户端浏览器交互,不再需要使用静态的HTML页面,可从数据库读取信息,可以获取用户的请求参数;劣势: 开发动态Web应用难度非常大,性能等各方面也存在限制);
(3) Servlet技术成为动态Web应用的主要开发技术(优势: Servlet基于Java语言创建的,可以利用Java语言的优势,如JDBC、多线程等等)
Servlet在Web应用中被映射成一个URL,该URL可以被客户端浏览器请求,当用户向指定URL对应的Servlet发送请求时,该请求被Web服务器接收到,该Web服务器负责处理多线程、网络通信等功能,而Servlet的内容决定了服务器对客户端的响应内容。
(4) JSP技术(特点:JSP作为脚本语言,不能被立即执行,JSP必须先编译成Servlet,也就是说JSP的实质是Servlet。但JSP的书写要比Servlet简单的多)
Model1和Model2:
Model1:
在Model1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接受处理客户端请求,对请求处理后直接作出相应。用少量的JavaBean来处理数据库连接、数据库访问等操作.
缺点: 从工程化的角度来看,Model1的局限性非常明显。JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,导致代码的重用性非常低,增加了应用的扩展性和维护的难度。
Model2:
Model2采用了MVC的设计: 在Model2架构中,Servlet作为前端控制器,负责接收客户端的请求,在Servlet中包含控制逻辑和简单的前端处理; Servlet调用后端JavaBean来完成实际的逻辑处理; 最后转发到相应的JSP页面负责显示.
特点: Model2下JSP不再承担控制器的责任,它仅仅是表现层角色,仅仅用于将结果呈现给用户,JSP页面的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。在Model2模式下,模型(Model)由JavaBean充当,视图(View)由JSP页面充当,而控制器(Controller)则由Servlet充当。
MVC模式及其优势:
MVC思想讲一个应用分成三个基本部分: Model(模型)、View(视图) 和 Controller(控制器),这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
特点:
(1) 多个视图对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护。
(2) 模型返回的数据与显示逻辑分离。模型数据可以应用任何显示技术,如JSP、Velocity模板或者直接产生Excel文档等。
(3) 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性。
(4) 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念。
(5) MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Struts1的缺陷与现状:
Struts目前已经分化成两个截然不同的版本: (1)基于传统Struts的Struts 1; (2)基于WebWork的Struts 2。由于Struts1与JSP/Servlet耦合非常紧密,因而导致了许多不可避免的缺陷,下面简单介绍Struts1的缺陷:
(1) 支持的表现层技术单一。Struts 1只支持JSP作为表现层技术,不提供与其他表现层技术,如Velocity、FreeMarker等技术的整合.
(2) 与ServletAPI严重耦合。
(3) 代码依赖于Struts 1 API。
Struts 1已基本无人使用,故今后不会再对Struts 1做相关介绍。
Struts 2的天生优势与体系:
Struts 2是由WebWork升级而来的,WebWork已经不存在了,彻底变成了Struts 2。Struts 2采用了一种更加松耦合的设计,让系统的Action不在与ServletAPI耦合,是单元测试更加方便,允许系统从B/S接口向C/S结构转换。
Struts2的优势:
(1) Action无须与Servlet API耦合,更易测试。Struts 2的Action更像一个普通的Java对象,该控制器代码中没有耦合任何Servlet API。
(2) Action无须与WebWork耦合,代码重用率高。
(3) 支持更多的表现层技术,有更好的适应性。对JSP、Velocity和FreeMark等多种表现层技术都提供了很好的支持。
(4) 更好的模块化支持。无论是Action管理、Action的输入校验,还是国际化资源文件的管理,Struts2都提供了更好的模块化支持。
(5) 更好的可扩展性。Struts 2框架的核心由大量拦截器实现,这些拦截器都是可"插拔式"的,因此开发者可以随时替换、升级其中的一个或多个拦截器。
Struts 2架构:
Struts 2架构的大致处理流程如下:
(1) 浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf等。
(2) 核心控制器StrutsPrepareAndExecuteFilter根据请求决定调用合适的Action。
(3) Struts 2的拦截器链自动对请求应用通用功能,如workflow、validation或文件上传等功能。
(4) 回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以将数据保存到数据库,也可以从数据库中检索信息。实际上,Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。
(5) Action的execute方法将处理结果存入Stack Context中,并返回一个字符串; StrutsPrepareAndExecuteFilter将根据返回的字符串跳转到指定视图资源,该视图资源将会读取Stack Context中的信息,并向浏览器生成响应数据。这些响应数据既可以是HTML页面、图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。
Struts 2的配置文件:
当Struts创建系统的Action代理时,需要使用Struts 2的配置文件。Struts 2的配置文件有两份:
配置Action的struts.xml文件.
配置Struts 2全局属性的struts.properties文件.
struts.xml文件内定义了Struts 2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。
Struts 2的全局属性的配置文件Properties文件: struts.properties:
# 指定Struts 2处于开发状态 struts.devMode = false # 指定当Struts 2配置文件改变后,Web框架是否重新加载Struts 2配置文件 struts.configuration.xml.reload=true
Struts 2的标签库:
Struts 2的标签库也是Struts 2的重要组成部分,Struts 2的标签库提供了非常丰富的功能,这些标签库不加提供了表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化、Ajax支持等功能。
Struts 2的控制器组件:
Struts 2的控制器组件是Struts 2框架的核心,事实上,所有的MVC框架都是以控制器组件为核心的。正如前面提到的,Struts 2的控制器由两部分组成: StrutsPrepareAndExecuteFilter和业务控制器Action。Struts 2应用中起作用的业务控制器不是用户定义的Action,而是系统生成的Action代理,但该Action代理事宜用户定义的Action为目标的。
Action的特点:
(1) Action类完全是一个POJO,因此具有很好的代码复用性。
(2) Action类无须与Servlet API耦合,因此进行单元测试非常简单。
(3) Action类的execute方法返回一个字符串作为处理结果,该处理结果可以映射到任何视图,甚至是另一个Action。