struts2之一 struts2的启动流程

struts2之一 struts2的启动流程

今天我们主要讨论当服务器启动时,struts2容器所做的事情

首先服务器加载web.xml文件中的struts配置文件

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern> //表示过滤请求的所有资源</filter-mapping>

这是一段过滤器的配置,目的是初始化struts2的相关参数,当加载到这段配置的时候,服务器会加载struts2StrutsPrepareAndExecuteFilter这个过滤器类,那么我们就来看看这个类


这是该类的结构图,该类实现了StrutsStatics, Filter filterstruts2的顶级过滤器接口,想要写过滤器则必须要实现该接口,而StrutsStatics这个接口则只是封装了一些常量,下面我们来看StrutsPrepareAndExecuteFilter这个过滤器类中的相关方法,很明显首先执行的是init方法,部分重要的代码如下:

publicvoid init(FilterConfig filterConfig) throws ServletException {        try {            FilterHostConfig config = newFilterHostConfig(filterConfig);  //把servlet容器与核心过滤器做了一个整合            init.initLogging(config);            dispatcher =init.initDispatcher(config);  //初始化所有的资源文件,包括 default.properties,struts-default.xml ,struts-plugin.cmlstruts.xml并且按照顺序来初始化           }

那么我们就来看看dispatcher = init.initDispatcher(config)这个方法的相关信息

Dispatcher dispatcher =createDispatcher(filterConfig);

dispatcher.init();进入init

<pre name="code" > public void init() {        try {            init_FileManager();  //初始化文件管理器            init_DefaultProperties(); // 加载default.properties文件           init_TraditionalXmlConfigurations(); //加载struts-default.xml,strut-plugin.xml,struts.xml            Container container =init_PreloadConfiguration(); //初始化预加载构造器            container.inject(this);//注入容器           }}


 

 

好了,其他的一些初始化东西在这里就不详细介绍了,既然struts2加载了这么多配置文件,肯定有它的用处,那么我们就来详细看一下这几个文件default.properties,struts-default.xml,strut-plugin.xml,struts.xml

Default.properties文件里面的内容很多,我在这只介绍一小部分重要的

# struts.objectFactory = spring //这是struts2的对象工厂,是产生像actionresult等等的工厂,待会会详细介绍,这里表示用spring产生,但是被注释掉了

struts.devMode = false //这里表示是否开启调试模式

struts.ui.templateSuffix=ftl //这是struts2的网页模板,但是一般都不太适合我们用,所以我们都会覆盖该功能,写自己的样式

struts.handle.exception=true//这是struts2的异常处理模板,struts2提供了很强大的异常处理,但是也肯定有他的缺点,我们以后再介绍

struts-default.xml部分配置如下

<struts>   <bean name="struts"/> //这是对象工厂的顶级父类属于xwork的东西,要注意name="struts"表示由struts产生对象工厂   <bean type="com.opensymphony.xwork2.factory.ResultFactory"name="struts" /> //这是结果集的产生方式   <bean type="com.opensymphony.xwork2.factory.ActionFactory"name="struts" />//Action的产生方式     <beantype="com.opensymphony.xwork2.util.ValueStackFactory"name="struts" /> //值栈的产生方式,很重要   <beantype="com.opensymphony.xwork2.factory.ConverterFactory"name="struts" /> //转换器的产生方式   <beantype="com.opensymphony.xwork2.factory.InterceptorFactory"name="struts"/> //拦截器的产生方式   <beantype="com.opensymphony.xwork2.factory.ValidatorFactory"name="struts" /> //验证机制的产生方式   <package name="struts-default"abstract="true"> //这是包,而包是struts发明的一种相当漂亮的继承关系       <result-types>//这里是各种结果集,常用的有chain redirect  redirectAction            <result-typename="chain"/> //表示服务器之间的转发到action,是action跳至action,可以在多个action之间共用一个request            <result-typename="dispatcher"default="true"/>//转发到jsp,它也是默认值            <result-typename="redirect"/>//重定向到jsp            <result-typename="redirectAction"/>//重定向到action ,至于转发和重定向的区别我就不多说了。            </result-types>        <interceptors>//这里是拦截器,我只介绍几个            <interceptorname="clearSession" />//很明显 清空session            <interceptorname="exception"/> //异常拦截器            <interceptorname="fileUpload"/> //文件上传            <interceptorname="i18n"/> //编码                       <interceptorname="modelDriven"/> //模型驱动,很重要                  <!-- Basic stack -->            <interceptor-stackname="basicStack">  //这是拦截器栈,其实就是多个拦截器加在一块                <interceptor-refname="exception"/>                   <interceptor-refname="conversionError"/>                <interceptor-refname="deprecation"/>            </interceptor-stack>                 <default-interceptor-refname="defaultStack"/> //设置默认的拦截器栈        <default-class-ref />    </package></struts> 

struts-plugin.xml这个文件是struts2的插件,因为它的插件有很多,这里就不说了,

Struts.xml文件是程序员自己定义的,这里也不介绍了。

总结:

上面说了这么多,在这里总结一下,web服务器启动的时候,会加载web.xml的配置文件,然后加载struts2的过滤器,会初始化所有的资源文件,比较重要的资源文件有struts-default.xmlstruts-plugin.xml Struts.xml

这三个文件的内容请参考上面的讲解,需要注意的是:

1.三个xml文件的dtd一样,所有出现相同的内容会后者覆盖前者

2struts-plugin.xml文件肯定不止一个,所有的插件以jar包的形式放到工程中,肯定在根目录有多个struts-plugin.xml文件,这个文件里可以定义拦截器 bean…. 结果集

3、根据beanobjectfactory可以了解对象的产生方式所有的action拦截器结果集值栈都可以通过objectFactory产生,也可以通过objectFactory和静态注入改变Action拦截器结果集值栈的产生方式

4、在struts2的配置文件 两大类型的配置需要注意,

一种类型 独立于包外的 像 bean constant include 另一种类型 在 package内的 像 action,interceptor,result等都是在package中的,可以利用extend机制继承实现复用

推荐阅读