struts2框架的的执行流程:(用户要访问一个Action类)
当web服务器启动的时候:
1.第一步:web服务器启动的时候读取到了web.xml文件中,用户已经配置了一个struts2的一个核心过滤器,这时候在访问过滤器配置的过滤请求的时候要先经过此过滤器。而经过此过滤器之前,要先经过服务器的一些过滤器,然后到达struts2的核心过滤器即StrutsPrepareAndExecuteFilter。
2.按照过滤器创建的标准流程,会先调用过滤器的构造方法-->init()方法-->dofilter()方法-->destroy()方法。
2.1 构造方法就是直接调用构造器的函数。
2.2 init(FilterConfig filterConfig)方法。这个方法主要是用来得到web服务器通过filterConfig
传过来的初始化参数,然后加载
default.properties,struts-default.xml,struts-plugin.xml,struts.xml配置文件。并将这些信息封装在自己的一个内部对象PrepareOperations中。(在接下来的操作中我们可以通过这个对象中封装的信息得到想要访问的Action等信息)
接收服务器传过来的初始化参数,将服务器传递过来的filterConfig封装到自己内部的FilterHostConfig对象中。
2.3 初始化完成以后,接着会执行dofilter()操作。这个操作开始进行了一些常规的设置比如设置编码方式,国际化等,同时创建了一个很重要的对象就是Action的上下文对象。接着会获取ActionMapping对象。ActionMapping对象里保存了用户在struts.xml文件中配置的Action的各种信息,包括名称空间,Action名字,返回结果,参数等信息。当用户请求的路径通过解析可以在ActionMapping对象中找到一个Action类处理此请求,则请求成功。接着过滤器会将请求发送给ActionProxy对象,为请求对应的Action类创建一个代理对象,并在代理对象中根据配置文件中配置的拦截器栈中的拦截器,按顺序调用拦截器方法,接着执行Action类中配置的方法,接着将结果跳转到result中指定的页面。然后反向执行拦截器,这样dofilter()方法就执行完毕了。
注意:1)通过上面的分析我们可以看出,用户不会直接执行action,而是通过代理对象的方法使用Action类中的方法。
2)拦截器中的方法是通过动态代理模式调用的,而过滤器则是过滤用户的请求的。拦截器方法是通过反射实现,而过滤器方法就是直接是方法回调的方式实现。