Struts简介
Struts是Apache赞助的一个开源项目,通过采用JavaServlet、JSP技术,实现了基于Java EE Web应用的MVC设计模式的应用框架。
它是一个开源的框架,虽然Servlet、JSP等可以帮助用户解决大部分问题,但是由于他们的编码对项目的开发带来了许多的不便,可重用性差,所以使用Struts的目的是为了帮助我们减少在运用MVC设计模式来开发Web应用的时间。
Struts原理
Struts是对JSP中Model2设计标准的一种实现。关于Model1和Model2的区别,还请移步《
浅析Java开发中的Model1和Model2
》。
(1)、视图 View
在Struts中,视图层包含两部分:JSP页面和ActionForm
ActionForm封装了用户提交的表单信息,其实ActionForm本质上就是JavaBean,只是这些JavaBean中没有业务逻辑,只是提供了所有属性的getter和setter方法,这些属性和用户表单中的输入项是一一对应的。在Struts中通过ActionForm把用户表单的信息提交给控制器。
JSP页面主要是用来显示。
此外,Struts还提供了一个强大的struts标签库,来帮助用户解决显示逻辑,并且利用ActionForm组件将信息传递到控制层。
(2)、控制器 Controller
在控制层,Struts提供了一个控制器组件ActionServlet,它继承自HttpServlet,并重载了doGet和doPost方法,接收HTTP的响应,并进行转发,同时还提供了对使用XML进行转发映射的功能。
(3)、模型 Model
模型表示状态和业务逻辑的处理,在一般的Web应用程序中,用JavaBean或者EJB来实现系统的业务逻辑。在Struts中,Struts提供Action对象,来管理业务逻辑的调用,帮助用户分离业务逻辑,也就是说Struts本身不实现业务逻辑,但可以调用已经完成的业务逻辑。
Struts工作流程
ActionServlet是Struts中的核心控制器,所有的用户请求都必须通过ActionServlet的处理,而struts-config.xml是Struts中核心的配置文件,在这个XML文件中,配置了用户请求URL和控制器Action之间的映射关系,ActionServlet通过这个配置文件把用户的请求发送到对应的控制器中。
在Struts Web应用程序中,当web应用程序启动时,就会初始化ActionServlet。在初始化ActionServlet的同时,会加载struts-config.xml配置文件,在加载成功后,会把这些URL和控制器之间的存在的映射关系存放到ActionMapping对象或其他对象中。当ActionServlet接收到用户请求时,就会按照下边的流程对用户请求进行处理。
(1)、ActionServlet接收到用户的请求后,会根据URL寻找匹配的ActionMapping对象,如果匹配失败,说明用户请求的URL路径信息错误,所以返回请求路径无效的信息。当找到匹配的ActionMapping的时候,就会进入下一步。
(2)、当ActionServlet找到匹配的ActionMapping对象的时候,会根据ActionMapping中的映射信息判断对应的ActionForm对象是否存在。如果不存在对应的ActionForm对象,就创建一个新的ActionForm对应,并把用户提交的表单信息保存到这个ActionForm对象中。
(3)、在struts-config.xml配置文件中,可以配置表单是否需要验证,如果需要验证,就调用ActionForm中的validate()方法对用户输入的表单进行验证。
(4)、如果ActionForm的validate()方法返回了ActionErrors对象,则表明验证失败,ActionServlet把这个页面返回到用户输入的页面,提示输入信息有误,重新输入。如果方法的返回值为null,就表明验证通过,可以进入到下一步进行处理。
(5)、Actions可以根据ActionMapping对象查找用户请求,转发给相对应的控制器Action。如果对应的Action对象不存在,就创建这个对象,并调用这个Action中的execute()方法。
(6)、业务逻辑控制器Action的execute()方法就会返回一个ActionForm对象,ActionServlet把控制器处理的结果转发到ActionForm对象指定的JSP页面。
(7)、ActionForm对象指定的JSP页面根据返回的处理结果,用合适的形式把结果显示给用户。
到这里为止,一个客户请求的整个过程完毕。
结语
以上,对Struts1框架进行了简要介绍,对其原理进行了简单的分析。接下来还需要在实践中去运用,去体会。原理固然重要,但实践更是所必须的。