Struts是对MVC模式实现的一个Web应用框架。MVC的工作原理我们都很熟悉那么struts是如何实现这一模式思想的呢?(本文中介绍到的是struts1中的实现原理)
首先我们知道MVC分为View——controller——Model,在struts2中也是如此只是实现的流程不同而已。
首先先来一个整体的调用关系图:
MVC思想实现:
Web端发出请求后ActionServlet截取请求的URL,根据struts-config.xml配置文件调用相应的action。这一过程相当于是controller负责页面请求和业务逻辑的桥接。
Action调用相应的model和数据库交互完成后返回数据。这一过程相当于是model的作用。
数据返回后再次由ActionServlet进行页面的匹配将数据展示到View。
大致的流程如上描述,那么具体到代码中整个流程是如何实现的呢,三层之间数据的传递是否也是有实体model完成的呢?在此需要了解struts1中三个重要的概念:ActionForm、ActionMapping、ActionForward。
ActionFrom:
保存和传递数据,相当于我们所熟知的model实体类。在使用中可以对应我们的数据库字段类型建model实体一样建立多个ActionForm也可以建立一个动态的ActionForm。
ActionMapping:
用来保存struts-config.xml中某一个action的所有配置信息的。对ActionServlet来说是一个重要的对象。几乎所有的配置信息都是通过ActionMapping读取的。
ActionForward:
封装转发信息,通过它可以转发或重定向到指定的页面上。
那么在具体的流程中以上三者又是怎样被使用的呢,先来看整体详细的流程图:
由图可以知道当Web端请求ActionServlet接受到请求后会调用RequestProcessor类中的Process方法,这是一个request的处理器类,request可以携带web端几乎所有的请求信息。
1、首先processPath方法会截取请求的URL,根据截取到的URL到struts-config.xml中读取相应的action配置。
2、根据截取的URL调用processMapping方法,将action配置的信息转换为ActionMapping对象。
3、调用processActionForm方法,可根据ActionMapping对象中的name值查找到配置的ActionForm然后实例化一个对象设置到request或session中。
4、ActionForm被实例化后会调用processPopulate方法,这个方法是将web端的数据设置到ActionForm对象的,根据的是web输入域中的name进行匹配的。
5、实体model创建完毕后接着就会调用ProcessActionCreate方法,看方法名就能知道这是要创建Action了,根据的还是ActionMapping中的信息。如果Action已经存在直接返回,如果不存在就会根据完整的类路径采用反射机制创建action。
6、现在实体类、action都已经存在剩下的就是执行我们写的代码。processActionPerform就会调用我们自己在action中写的execute方法,方法执行完毕返回的是ActionForward对象,最后调用processForwardConfig方法完成转向。
小结:
Struts1实现MVC的整体流程就是这样的,主要的控制是通过配置文件来完成的,那么想用使用struts1这样的框架具体的应该怎么做,下篇博客我们开启实践模式。