前边对Struts2有了一些了解,为了进一步理解,对其工作流程进行分析。
一、从无到有的过程
在不用Struts框架之前我们需求的功能也是可以实现的,下面就从最初当我们不用框架的基本功能实现方法过度到使用框架,同时体会框架的强大之处。
1、 需求:实现如下链接访问:/mytest/addAction.action、/mytest/deleteAction.action、/helloworld/helloworldaction.action。在逻辑部分实现类名输出。
2、 基本实现
首先需要为每个请求创建一个类,在对应的类中调用execute方法实现逻辑功能。同时定义一个Filter,根据路径判断创建哪个对象并调用其方法。
3、 增强扩展性
为了代码的通用性和复用性,在这里定义一个接口:Action,在接口中定义execute方法,然后让别的Action实现该接口。在Filter中就不再直接new对象,而是通过反射获取对象,同时将需要反射创建的对象和对应的请求以键值对的形式放到Map中
4、 增加配置文件
经过上边几步之后,代码中还是有些问题,代码中所有的有关请求的字符串都是写死的,这样扩展性就是一个很大的问题,由于配置文件是不用的编译的,因此可以考虑将变动的请求链接都配置到配置文件中。为了让转向页面也是可配置的,可以让execute方法返回一个字符串,用来指定转向页面。在代码运行时解析配置文件,
二、过程分析
此时代码执行过程为:首先tomcat启动→加载web.xml文件→加载过滤器→加载并解析配置文件。这样在需要一个新的请求时只需要增加配置文件信息,Action类和转向的JSP页面即可。
三、Struts2框架实现及流程
Struts2框架的实现过程大致就是上边的过程,但是struts2的框架将更多的功能实现都封装了起来,例如;数据封装、类型转化、国际化等。下面对其执行流程进行分析:
1、 web客户端发送请求信息
2、 到达Tomcat,创建HttpServletRequest和HttpServletResponse对象,被struts2的过滤器StrutsPrepareAndExecuteFilter拦截。
3、 通过ActionMapping对象判断是否为Action请求。如果不是,直接转向JSP页面。(下面为Action请求)
4、 依次调用从ExcuteOperations到Dispatcher调用到DefaultActionProxyFactory,创建一个代理类StrutsActionProxy。
5、 创建ActionInvocation,然后相关Action和拦截器都会放到ActionInvocation中。
6、 依次执行拦截器。
7、 调用到Action方法,返回需要转向的字符串。
8、 通过返回的字符串,创建Result对象,并转向对应JSP页面
9、 拦截器依次出栈,返回结果在JSP页面渲染。
四、体会
Struts2中18个拦截器的设计思想很有借鉴意义,如果不将这些功能分开来,就会导致整个拦截器过于庞大,而且不便于控制和切换,Struts2的拦截器通过配置文件,设计成了一个可以配置的一个功能,如果不需要就可以将其去掉,而且还可以自己定义和添加,从而显的十分灵活。这是我们设计软件需要追求的一种好的效果。