Struts 框架的基本概念及实现MVC模式的原理

时间:2022-12-19 19:50:34

Struts 框架的基本概念

当建筑师开始一个建筑项目时,首先要设计该建筑的框架结构,有了这份蓝图,接下来的实际建筑过程才会有条不紊,井然有序。同样,软件开发者开始一个软件项目时,首先也应该构思该软件应用的框架,规划软件模块,并定义这些模块之间的接口和关系。简单地说,框架是一组用于解决特定软件问题的类和接口的集合。
框架可以提高软件开发的速度和效率,并且使软件更便于维护。框架提供了一整套预制的软件构件,能够为开发者所使用、扩展及定制以满足特定的业务需求。框架是软件系统的设计开发过程中的一个概念,它强调对已完成的设计、代码的重复使用。框架通常具有如下的特性:
(1)组成框架的类和组件,一般都提供对一些概念、方法的抽象。
(2)框架定义抽象直接的关系和交互,用以解决特定的问题。
(3)框架的组件是可重用的。
对于开发 Web 应用,要从头设计并开发出一个可靠、稳定的框架并不是一件容易的事。幸运的是,随着 Web 开发技术的日趋成熟,在 Web 开发领域出现了一些现成的优秀的框架,开发者可以直接使用它们,Struts 就是一种不错的选择,它是基于MVC 的 Web 应用框架。
Struts 最早于 2000 年 5 月作为 Jakarta 项目的组成部分问世,Jakarta 项目由Apache(www.Jakarta.apache.org)基金组织运作。Jakarta-Struts 是 Apache 软件组织提供的一项开放源代码项目,它为 Java Web 应用提供了模型-视图-控制器(Model-View-Controller,MVC)框架,尤其适用于开发大型可扩展的 Web 应用。Struts这个名字来源于在建筑和旧式飞机中使用的支撑金属架。Struts 为 Web 应用提供了
一个通用的框架,使得开发人员可以把精力集中在如何解决实际业务问题上。此外,Struts 框架提供了许多可供扩展和定制的地方,使得应用程序可以方便地扩展框架,来更好地适应用户的实际需求。


Struts 实现 MVC 的原理

Struts 实质上就是在 JSP Model2 地基础上实现的一个 MVC 框架。在 Struts 框架中,模型由实现业务逻辑地 JavaBean 或 EJB 组件构成,控制器由 ActionServlet 和Action 来实现,视图由一组 JSP 文件构成。
(1)视图
视图就是一组 JSP 文件。在这些 JSP 文件中没有业务逻辑,也没有模型信息,只有标签,这些标签可以是标准地 JSP 标签或客户化标签,如 Struts 标签库中的标签。此外,通常把 Struts 框架中的 ActionForm Bean 也划分到视图模块中。ActionFormBean 也是一种 JavaBean,除了具有一些 JavaBean 的常规方法,还包含一些特殊的方法,用于验证 HTML 表单数据以及将其属性重新设置为默认值。Struts 框架利用ActionFrom Bean 来进行视图和控制器之间表单数据的传递,Struts 框架把用户输入的表单数据保存在 ActionFrom Bean 中,把它传递给控制器,控制器可以对ActionFrom Bean 中的数据进行修改,JSP 文件使用 Struts 标签读取修改后的ActionFrom Bean 的信息,重新设置 HTML 表单。
(2)模型
模型表示应用程序的状态和业务逻辑。对于大型应用,业务逻辑通常由 JavaBean或 EJB 组件实现。
(3)控制器
控制器由 ActionServlet 类和 Action 类来实现。ActionServlet 类是 Struts 框架中的核心组件。ActionServlet 继承了 Javax.servlet.http.HttpServlet 类,它在 MVC 模型中扮演*控制器的角色。ActionServlet 主要负责接受 HTTP 请求信息,根据配置文件 struts-config.xml 的配置信息,把请求转发给适当的 Action对象。如果该 Action对象不存在,ActionServlet 会先创建这个 Action 对象。Action 类负责调用模型的方法,更新模型的状态,并帮助控制应用程序的流程。
对于小型简单的应用,Action 类本身也可以完成一些实际的业务逻辑。对于大型应用,Action 充当用户请求和业务逻辑处理之间的适配器(Adaptor),其功能就是将请求于业务逻辑分开,Action 根据用户请求调用相关的业务逻辑组件。业务逻辑由 Java Bean 或 EJB 来完成,Action 类侧重于控制应用程序的流程,而不是实现应用程序的逻辑[28]。通过将业务逻辑放在单独的 Java 包或 EJB 中,可以提高应用程序的灵活性和可重用性。
当 ActionServlet 控制器收到用户请求后,把请求转发到一个 Action 实例。如果这个实例不存在,控制器会首先创建它,然后调用这个 Action 实例的 execute()方法。Action 的 execute()方法返回 ActionForward 对象,它封装了把用户请求再转发给其他 Web 组件的信息。用户定义自己的 Action 类,即 Action 基类的子类时,必须覆盖 execute()方法。在 Action 基类中返回 null。
(4)Struts 的配置文件 struts-config.xml
上面讲到的一个用户请求是通过 ActionServlet 来处理和转发的。那么,ActionServlet 如何决定把用户请求转发给哪个 Action 对象呢?这就需要一些描述用户请求路径和 Action 映射关系的配置信息了。在 Struts 中,这些配置映射信息都存储在特定的 XML 文件 struts-config.xml 中。在该配置文件中,每一个 Action 的映射信息都通过一个<action>元素来配置。
这些配置信息在系统启动的时候被读入内存,供 Struts 在运行期间使用。在内存中,每一个<action>元素都对应一个 org.apache.struts.action.ActionMapping 类的实例。
 
<script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script> <script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script> <script type="text/javascript"><!--google_ad_client = "pub-7343546549496470";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as_rimg";google_cpa_choice = "CAEQuZSgnAIaCCdTYVW5ruWvKJnA93M";//--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>