Web应用开发早期曾经是那么的简单那个时候还只是纯HTML页面和浏览器特效而已由于还涉及不到动态数据操作和商业应用也就省去了很多麻烦但是这样的简单只是过眼云烟如今我们不得不为复杂的基于Web的商业应用开发采用诸多技术
本文将介绍如何利用Struts进行应用开发的前台整合的开发过程Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架(译注)是利用Java Servlet和JSP构建Web应用的一项非常有用的技术
阅读本文需要读者具有以下几方面的开发经验JSPServlet自定义标签库(custom tag library)和XML如果读者想补一补自定义标签库的知识可以参考作者以前关于这方面的文章而本文也是关于介绍如何使用Struts系列文章的上半部分本系列暂定分为上下两部分
新手上路注意事项
Struts是一个基于Sun JEE平台的MVC框架主要是采用Servlet和JSP技术来实现的其最初萌芽于Craig McClanahan的构思诞生至今也一年有余了(译注)现在Struts是Apache软件基金会旗下Jakarta项目组的一部分其官方网站是由于Struts能充分满足应用开发的需求简单易用敏捷迅速在过去的一年中颇受关注Struts把ServletJSP自定义标签和信息资源(message resources)整合到一个统一的框架中开发人员利用其进行开发时不用再自己编码实现全套MVC模式极大的节省了时间所以说Struts是一个非常不错的应用框架
目前的Struts 修正版包括完整的文档既可以说是用户文档又是开发指导文档如果读者是JSP新手或者对MVC设计模式不是太熟的话可能刚上路时会比较慢不过不用担心要相信自己会尽快赶上的:)
此外应该注意到尽管当前Struts只是版但已经相当稳定了作者从Struts 版就在一个大规模的项目中应用了(最近升级到版)至今还没有遇到什么麻烦问题实际上Struts在这个要开发复杂用户界面的项目中为我们团队大大的缩短了开发时间在此衷心的感谢Struts项目团队的所有开发人员
哦还有如果读者开始上路了要知道Struts的邮件列表可是有相当分量的在这里混混才可保证能及时跟上Jakarta项目的最新动态哦
开始上路!
Struts框架可分为以下四个主要部分其中三个就和MVC模式紧密相关
模型(Model)本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论)开发者通过其实现商业逻辑同时用户请求通过控制器(Controller)向Action的转发过程是基于由strutsconfigxml文件描述的配置信息的
视图(View)View是由与控制器Servlet配合工作的一整套JSP定制标签库构成利用她们我们可以快速建立应用系统的界面
控制器(Controller)本质上是一个Servlet将客户端请求转发到相应的Action类
一堆用来做XML文件解析的工具包Struts是用XML来描述如何自动产生一些JavaBean的属性的此外Struts还利用XML来描述在国际化应用中的用户提示信息的(这样一来就实现了应用系统的多语言支持)
好下一步咱们来看看构成这个框架的各个部分以及相互之间是怎样运作的吧!
搞定配置先
在使用Struts之前咱们必先设置好JSP服务器以便让服务器在用户请求时知道该如何将指定后缀的请求转到相应的Controller-Struts ActionServlet处理当然这些配置信息都一般在服务器启动时通过webxml文件读入的我们可以在webxml定义多个Controlloer为每一个应用定义一个一个典型的webxml文件配置如下其中有相应的注释很好懂的在后面讨论Action的时候我们将主要分析strutcconfigxml
<webapp>
<servlet>
<!
以下配置信息声明了Struts中的ActionServlet即一个名为OreillyAction的Servlet其具体实现为orgapachestrutsactionActionServlet在这个配置中还有这个Servlet的两个参数debug level和detail此处这两个参数的值都设为了此外还设置了在启动载入时创建两个实例
>
<servletname>OreillyActionServlet</servletname>
<servletclass>orgapachestrutsactionActionServlet</servletclass>
<initparam>
<paramname>config</paramname>
<paramvalue>/WEBINF/strutsconfigxml</paramvalue>
</initparam>
<initparam>
<paramname>debug</paramname>
<paramvalue></paramvalue>
</initparam>
<initparam>
<paramname>detail</paramname>
<paramvalue></paramvalue>
</initparam>
<loadonstartup></loadonstartup>
</servlet>
<!
设置所有后缀为action的请求都转发到OreillyActionServlet
>
<servletmapping>
<servletname> OreillyActionServlet </servletname>
<urlpattern>*action</urlpattern>
</servletmapping>
<!
将初始请求页面设置为loginjsp
>
<welcomefilelist><welcomefile>loginjsp</welcomefile></welcomefilelist>
<!
设置Struts的JSP页面要用到的标签库和她们的路径
>
<taglib>
<tagliburi>/WEBINF/strutsbeantld</tagliburi>
<tagliblocation>/WEBINF/strutsbeantld</tagliblocation>
</taglib>
<taglib>
<tagliburi>/WEBINF/strutshtmltld</tagliburi>
<tagliblocation>/WEBINF/strutshtmltld</tagliblocation>
</taglib>
<taglib>
<tagliburi>/WEBINF/strutslogictld</tagliburi>
<tagliblocation>/WEBINF/strutslogictld</tagliblocation>
</taglib>
</webapp>
控制器(Controller)
Controller是这个框架中扮演交通警察的角色当客户端与服务器有交互动作时都由她来控制Controller将HTTP请求封包并转发到框架中相应的对象这些对象可能是一个JSP页面或一个Action
Controller在webxml中设置为orgapachestrutsactionActionServlet的一个实例在本例中这个实例就是OreillyActionServlet在一个完整的控制过程中也就是处理一个HTTP请求时在控制过程之初这个Servlet会从一个配置文件strutsconfigxml中获取请求与控制动作向对应的配置信息这个我们会在后面详细讨论Controller通过这些配置信息来决定HTTP请求该往何处转发而这些Action在接收到转发来的请求后实现真正的商业逻辑我们要注意的非常重要的一点是Action对象要能够调用这个ActionServlet的若干方法通过这个有力的特性当Action对象在控制过程中将请求再向别的Action对象转发时(最初的请求是由ActionServlet获取向Action对象转发而Action对象还可以再转发到别的对象)我们可以将一些需要共享的数据对象通过调用一些方法放入这个Servlet相关的一些标准容器中捎带过去
模型(Model)
所谓Model就是在对用户请求的整个控制过程中真正处理用户请求并保存处理结果的对象在整个过程中我们一般利用JavaBean来把一些信息保存起来以便在各个对象之间传递因为在框架中Model对象是真正处理商业逻辑功能的对象因此也就是框架中应用需求实现相关性最大的部分在Struts的实现里Model的具体表现形式就是ActionForm对象和与其对应的Action对象了对用户提交表单的数据进行校验甚至对数据进行预处理都能在ActionForm中完成通常的应用中一般是一个Model对象和一个请求页面对应的关系但也可以一个Model对象对应多个页面请求如果strutsconfigxml配置文件没有指定一个Model对象对应的Action那么控制器将直接把(通过Model对象完成数据封装的)请求转到一个View对象
strutsconfigxml
前面多次提到的strutsconfigxml配置文件是整个框架的主心骨webxml文件定义了一个请求到来应向何处转发后后面的工作就全权由strutsconfigxml管理控制了可以说strutsconfigxml就是整个Struts框架的扛把子(译注)只有这位老大清楚所有请求与动作的映射关系要是他哪里没有搞定或不爽的话整个社团就什么也摆不平了:)如今的应用系统XML形式的配置文件越来越多如果整个系统只使用一个这样的配置文件的话那么保持整个系统的模块化和可维护性都非常的轻松使用配置文件来描述请求动作的控制过程和相互关系而不是在代码中将对象之间的调用关系写死那么都应用系统有变动时我们只用修改配置文件就行了而不是再重新编译发布程序了
Controller通过strutsconfigxml文件的配置信息确定当有请求时应该调用那个对象来处理从效率的角度出发这些信息都是在系统启动时读入并存在内存中的下面我们将讲解一个极短小的strutsconfigxml文件文件中定义了一个与登录请求对应的登录动作请求到达后将被转发到comoreillyuiauthenticationactionsLoginAction这个Action对象该对象处理