模型视图控制器(ModelViewControllerMVC)体系突出了Servlets和JSP的优点同时也令它们的缺点最小化在实现中用户请求被发送到一个控制器servlet该servlet决定请求的性质并且根据请求的类型传送给适合的处理器每个处理器都和一个特别的模型相关里面封装有商业逻辑来执行一些特别的函数集合处理完毕后结果会发送回处理器处理器选择适合的视图显示它
Struts最早于年月作为Jakarta项目的组成部分问世Jakata项目由Apache Foundation运做项目的创立者希望该项目的研究改进和提高Java Server Pages (JSPs)servlet标签库以及面向对象的技术水准Struts为使用MVC体系来编写应用提供了一个架构Struts使用ActionMapping它允许servlet将用户的请求转变为应用行为ActionMapping通常指定一个请求的路径在请求上进行动作的对象类型以及指定其它需要的属性
Action对象作为ActionMapping的一个部分使用负责处理请求并且发送响应回适合的视图(通常是一个Web浏览器)或者传送请求至适合的模型
在模型和视图间的桥是一个form bean它可以通过继承orgapachestrutsactionActionForm得到form bean用来保存处理前的用户数据或者显示返回给用户的模型数据Struts包含有自定义的标签它可以由创建的form bean中自动组合字段
在实践中用户请求JSP页面控制器servlet接收请求并决定由哪个应用处理它Action对象传送该请求到包含有接收商业逻辑的JavaBean中商业逻辑bean将连接数据库并进行查询接收结果然后返回结果给Action对象Action对象将结果作为请求的一部分存放到一个form bean中一旦收集完请求的全部数据就可以格式化结果并且显示最后是JavaServer Page以HTML表格的形式将结果显示出来
模型控制器和视图
Struts中的控制器的基本组件是ActionServlet类中定义的servlet它是由ActionMappings定义的ActionMapping类表示的是Action对象的名字和位置当一个请求进入控制器时它将请求的路径映射到Action的位置并且将请求传送给ActionStruts的ActionMapping类还可能包含有其它的信息这些信息可能只是与你的应用相关例如本地变量环境变量或者其它URIs
Struts的关键是控制器周围的活动Struts控制器servlet映射事件到类(一个事件通常是一个HTTP POST GET或者类似的请求)ActionServlet是MVC设计模型的司令部也是Structs架构的核心ActionServlet创建和使用Action一个ActionForm和ActionForwardstrutsconfigxml是用来设置Action的在创建Web应用期间采用扩展Action和ActionForm来解决如何响应用户请求的问题strutsconfigxml则是告诉ActionServlet如何使用扩展类也可扩展ActionServlet以令Structs应用带有一些自定义的特性
这个方法有几个优点首先应用的整个逻辑流都是在一个分等级的文本文件中这样就可以比较容易地查看理解应用特别是大的应用第二编写网页的人在修改网页时就无需遍历Java代码来理解应用的流程而Java开发者在改变流程的时候也无需重新编译代码
ActionForm为Web应用维护session状态ActionForm是一个抽象类它可以被每个输入表格模型扩展它代表数据的一般概念可以被HTML表格设置或者更新例如你的应用也许拥有一个被HTML表格设置的UserActionFormStruts的架构将检查UserActionForm是否存在如果不存在就会创建一个该类的实例Structs将会使用HttpServletRequest的相应字段来设置UserActionForm的状态在传送UserActionForm给商业封装层的UserAction前Struct架构先更新UserActionForm的状态
Structs模型包含有系统的状态和它可以接受的操作可以使用各种各样的结构来表示模型(例如其它servlets或者JSP)不过在大多数的时候你都会使用JavaBeansJavaBean的属性或者在Enterprise JavaBeans (EJBs)中由外部数据源得到的数据表示的是状态而方法则是表示可以在上面进行的操作操作并不需要被JavaBean方法定义在简单的情况下操作可以放置到Action对象中虽然这样会令处理和分级之间的区别变得模糊
Struts MVC应用的视图通常由JSP构造它可以使用HTML或者XML静态格式化页面还提供了一个方法可动态插入自定义的内容来响应用户的请求Structs的一个关键是它的自定义标签库它提供了一个方法可以很容易地使用JSP来创建用户界面
Structs架构包含有自定义的标签库可以通过各种不同的方式使用虽然就使用该架构来说这些库并不是必须的不过它们包含的标签在你的应用的许多地方都很有用Structs的一些标签库包括有
structshtml标签库该库可以用作创建动态HTML用户界面或者表格
structsbean标签库对于将JavaBean代码放到JSP页面该库提供了一个加强方式通过 标签实现
strutslogic标签库该库可以管理有条件地产生输出文本遍历对象collections以重复地产生输出文本还有应用流控制
strutstemplate标签库该库包含的标签可用作为页面创建动态的JSP模板这些页面都拥有一个公共的外观或者公同的格式
使用这些标签库和其它的任何库都是一样的因为库已经写好了你所要做的就是告诉servlet引擎要使用它在Tomcat中你可以通过webxml文件中的<taglib>标签来指定标签库的URI以及Web服务器系统上标签库描述文件的位置
The Small Print
Jakarta工程可让你下载Structs的二进制版本或者直接由源代码中编译它二进制版工作得很好不过如果你拥有一个不常见的软件平台或者想学习一下如何编译它也不是很困难无论你的选择如何Structs都需要以下几个软件
Java Development Kit (JDK) 你需要为你的操作系统下载和安装一个Java JDK实现
.Servlet容器你还需要下载和安装一个兼容Servlet API规范(版以上)JSP规范(版以上)的servlet容器一个好的选择是下载Apache的Tomcat它可以支持网页服务并且可以运行servlet和JSP
.XML解析器Struts需要一个兼容Java API for XML Parsing (JAXP)规范(版或以上)的XML解析器
.Servlet API类为了编译Structs或者使用Structs的应用你将需要一个包含有servlet和JSP API类的servletjar文件大部分的servlet容器都包含有这个JAR文件
.JDBC optional package类Structs支持javaxsqlDataSource的一个可选实现因此它需要这些API类来编译你可以下载这些包类
要使用Structs来建立一个应用需要遵从以下步骤首先将Structs中的lib/commons*jar和 lib/strutsjar文件拷贝到应用中的WEBINF/lib目录然后将Structs中的全部标签库描述文件(lib/struts*tld)拷贝到你的Web应用中的WEBINF目录
拷贝完这些文件后你就可以修改Web应用中的webxml文件令它包含有一个<servlet>元素来定义控制器servlet还有一个<servletmapping>元素以指明哪个请求的URI被映射到这个servlet如果你使用默认的目录来进行一个标准的安装你可以使用Struts例子应用中的webxml文件来作为一个参考看它是如何设置的然后你就可以修改Web应用中的webxml文件来指定适当的标签库声明再次申明你可以由Structs的例子应用中学习如何设置
修改完webxml文件后在WEBINF目录创建一个称为strutsconfigxml的文件在其中定义操作映射和其它与你的应用相关的特性最后在每个将使用Struts自定义标签的JSP页面的顶部加入Struts自定义标签的声明
Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架它的目的是为了帮助你减少在运用MVC设计模型来开发Web应用的时间你仍然需要学习和应用该架构不过它将可以完成其中一些繁重的工作如果想混合使用servlets和JSP的优点来建立可扩展的应用Struct可以帮助你完成其中的一些工作