通过Struts应用MVC设计模型

作者:网络 来源:佚名 更新时间:2008-07-07 12:18:15 点击:
  模型--视图--控制器(model-view-controller,mvc)体系突出了servlets和jsp的优点,同时也令它们的缺点最小化。在实现中,用户请求被发送到一个控制器servlet,该servlet决定请求的性质,并且根据请求的类型传送给适合的处理器。每个处理器都和一个特别的模型相关,里面封装有商业逻辑来执行一些特别的函数集合。处理完毕后,结果会发送回处理器,处理器选择适合的视图显示它。

  struts最早于2002年5月作为jakarta项目的组成部分问世,jakata项目由apache foundation.运做。项目的创立者希望该项目的研究改进和提高java server pages (jsps)、servlet、标签库以及面向对象的技术水准。struts为使用mvc体系来编写应用提供了一个架构。struts使用“actionmapping”,它允许servlet将用户的请求转变为应用行为。actionmapping通常指定一个请求的路径、在请求上进行动作的对象类型,以及指定其它需要的属性。

  action对象作为actionmapping的一个部分使用,负责处理请求,并且发送响应回适合的视图(通常是一个web浏览器),或者传送请求至适合的模型。

  在模型和视图间的桥是一个form bean,它可以通过继承org.apache.struts.action.actionform得到。form bean用来保存处理前的用户数据,或者显示返回给用户的模型数据。struts包含有自定义的标签,它可以由创建的form bean中自动组合字段。

  在实践中用户请求jsp页面,控制器servlet接收请求并决定由哪个应用处理它。action对象传送该请求到包含有接收商业逻辑的javabean中。商业逻辑bean将连接数据库并进行查询,接收结果,然后返回结果给action对象。action对象将结果作为请求的一部分存放到一个form bean中。一旦收集完请求的全部数据,就可以格式化结果并且显示。最后是javaserver page以html表格的形式将结果显示出来。

  模型,控制器和视图

  struts中的控制器的基本组件是actionservlet类中定义的servlet,它是由actionmappings定义的。actionmapping类表示的是action对象的名字和位置。当一个请求进入控制器时,它将请求的路径映射到action的位置,并且将请求传送给action。struts的actionmapping类还可能包含有其它的信息,这些信息可能只是与你的应用相关,例如本地变量,环境变量或者其它uris。

  struts的关键是控制器周围的活动。struts控制器servlet映射事件到类(一个事件通常是一个http post, get,或者类似的请求)。actionservlet是mvc设计模型的司令部,也是structs架构的核心。actionservlet创建和使用action,一个actionform和actionforward。struts-config.xml是用来设置action的。在创建web应用期间,采用扩展action和actionform来解决如何响应用户请求的问题。struts-config.xml则是告诉actionservlet如何使用扩展类。也可扩展actionservlet以令structs应用带有一些自定义的特性。

  这个方法有几个优点。首先,应用的整个逻辑流都是在一个分等级的文本文件中。这样就可以比较容易地查看、理解应用,特别是大的应用。第二,编写网页的人在修改网页时就无需遍历java代码来理解应用的流程,而java开发者在改变流程的时候也无需重新编译代码。

  actionform为web应用维护session状态。actionform是一个抽象类,它可以被每个输入表格模型扩展。它代表数据的一般概念,可以被html表格设置或者更新。例如,你的应用也许拥有一个被html表格设置的useractionform。struts的架构将检查useractionform是否存在,如果不存在,就会创建一个该类的实例。structs将会使用httpservletrequest的相应字段来设置useractionform的状态。在传送useractionform给商业封装层的useraction前,struct架构先更新useractionform的状态。

  structs模型包含有系统的状态和它可以接受的操作。可以使用各种各样的结构来表示模型(例如其它servlets或者jsp),不过在大多数的时候你都会使用javabeans。javabean的属性,或者在enterprise javabeans (ejbs)中由外部数据源得到的数据--表示的是状态,而方法则是表示可以在上面进行的操作。操作并不需要被javabean方法定义;在简单的情况下,操作可以放置到action对象中,虽然这样会令处理和分级之间的区别变得模糊。

  struts mvc应用的视图通常由jsp构造,它可以使用html或者xml静态格式化页面,还提供了一个方法可动态插入自定义的内容来响应用户的请求。structs的一个关键是它的自定义标签库,它提供了一个方法,可以很容易地使用jsp来创建用户界面。

  structs架构包含有自定义的标签库,可以通过各种不同的方式使用。虽然就使用该架构来说,这些库并不是必须的,不过它们包含的标签在你的应用的许多地方都很有用。structs的一些标签库包括有:

  . structs-html标签库。该库可以用作创建动态html用户界面或者表格。

  . structs-bean标签库。对于将javabean代码放到jsp页面,该库提供了一个加强方式,通过 标签实现。

  . struts-logic标签库。该库可以管理有条件地产生输出文本,遍历对象collections以重复地产生输出文本,还有应用流控制。

  . struts-template标签库。该库包含的标签可用作为页面创建动态的jsp模板,这些页面都拥有一个公共的外观或者公同的格式。

  使用这些标签库和其它的任何库都是一样的。因为库已经写好了,你所要做的就是告诉servlet引擎要使用它。在tomcat中,你可以通过web.xml文件中的<taglib>标签来指定标签库的uri,以及web服务器系统上标签库描述文件的位置。

  the small print

  jakarta工程可让你下载structs的二进制版本,或者直接由源代码中编译它。二进制版工作得很好,不过如果你拥有一个不常见的软件平台,或者想学习一下如何编译它,也不是很困难。无论你的选择如何,structs都需要以下几个软件:

  . java development kit (jdk). 你需要为你的操作系统下载和安装一个java 2 jdk实现。

  .servlet容器。你还需要下载和安装一个兼容servlet api规范(2.2版以上)、jsp规范(1.1版以上)的servlet容器。一个好的选择是下载apache的tomcat,它可以支持网页服务,并且可以运行servlet和jsp。

  .xml解析器。struts需要一个兼容java api for xml parsing (jaxp)规范(1.1版或以上)的xml解析器。

  .servlet api类。为了编译structs或者使用structs的应用,你将需要一个包含有servlet和jsp api类的servlet.jar文件。大部分的servlet容器都包含有这个jar文件。

  .jdbc 2.0 optional package类。structs支持javax.sql.datasource的一个可选实现,因此它需要这些api类来编译。你可以在这个网址下载这些包类:http://java.sun.com/products/jdbc/download.html

  要使用structs来建立一个应用,需要遵从以下步骤。首先,将structs中的lib/commons-*.jar和 lib/struts.jar文件拷贝到应用中的web-inf/lib目录。然后将structs中的全部标签库描述文件(lib/struts-*.tld)拷贝到你的web应用中的web-inf目录。

  拷贝完这些文件后,你就可以修改web应用中的web.xml文件,令它包含有一个<servlet>元素来定义控制器servlet,还有一个<servlet-mapping>元素以指明哪个请求的uri被映射到这个servlet。如果你使用默认的目录来进行一个标准的安装,你可以使用struts例子应用中的web.xml文件来作为一个参考,看它是如何设置的,然后你就可以修改web应用中的web.xml文件来指定适当的标签库声明。再次申明,你可以由structs的例子应用中学习如何设置。

  修改完web.xml文件后,在web-inf目录创建一个称为struts-config.xml的文件,在其中定义操作映射和其它与你的应用相关的特性。最后,在每个将使用struts自定义标签的jsp页面的顶部,加入struts自定义标签的声明。

  struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。它的目的是为了帮助你减少在运用mvc设计模型来开发web应用的时间。你仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。如果想混合使用servlets和jsp的优点来建立可扩展的应用,struct可以帮助你完成其中的一些工作。