上一篇文章,我们介绍了MVC框架的基本原理,并指出了这个基本框架中存在大量if…else的问题。今天我们来介绍一下struts框架,让struts解决这个问题。
首先,看一下粗略的时序图:
ActionServlet是中央控制器,负责集区URL或分发;
ActionForm负责收集表单数据,并且,struts会将表单数据转换成相应的数据类型。
Action是业务层控制器。
上面就是struts大体上的实现,下面分析一下该struts框架执行流程:
1、终端客户向tomcat发出request请求;
2、tomcat会创建出HttpRequest和HttpResponse实例,并根据用户的Method请求方式,调用中央控制器的doGet或者doPost方法;
3、ActionServlet中央控制器负责截取URL,并且根据截取的URL,取得配置信息,将Action标签里面的信息放在ActionMapping里面。
4、根据ActionMapping中的name名称查找ActionForm,如果配置了ActionForm,那么就到request或session中查找,如果在request或session中存在已经创建的ActionForm,那么将返回;如果不存在,那么会根据ActionForm的完成路径采用反射进行创建,再将创建好的ActionForm放到reqeust或session中
5、首先执行ActionForm中的reset方法进行重置,然后得到表单中所有输入域的name名称,再调用request.getParameterValues(),根据name名称得到相应的值,最后将表单中的数据全部放到一个map中,map中的key为表单输入域的名称,map的value位表单输入域的值(字符串数组),接下来调用一个第三方组件BeanUtils,将Map中的值,根据ActionForm中的setter方法设置到ActionForm上。
6、根据Action的完成类名称到Map中查找,如果存在就在返回Action对象,否则根据Action类的完整名称采用反射去创建,再将创建好的Action放到Map中。所以struts1的Action是单实例的,存在线程安全问题。
7、执行用户自定义的Action中的Execute方法,将ActionMapping,ActionForm,request,response传递过去,将ActionForward返回给ActionServlet。
8、根据返回的ActionForward完成转向。
上面就是struts流程的基本实现。