今天我们主要讨论当服务器启动时,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的相关参数,当加载到这段配置的时候,服务器会加载struts2的StrutsPrepareAndExecuteFilter这个过滤器类,那么我们就来看看这个类
这是该类的结构图,该类实现了StrutsStatics, Filter filter是struts2的顶级过滤器接口,想要写过滤器则必须要实现该接口,而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.xml,struts-plugin.xml, Struts.xml
这三个文件的内容请参考上面的讲解,需要注意的是:
1.三个xml文件的dtd一样,所有出现相同的内容会后者覆盖前者
2、struts-plugin.xml文件肯定不止一个,所有的插件以jar包的形式放到工程中,肯定在根目录有多个struts-plugin.xml文件,这个文件里可以定义拦截器 bean…. 结果集
3、根据bean的objectfactory可以了解对象的产生方式所有的action拦截器结果集值栈都可以通过objectFactory产生,也可以通过objectFactory和静态注入改变Action拦截器结果集值栈的产生方式
4、在struts2的配置文件 两大类型的配置需要注意,
一种类型 独立于包外的 像 bean constant include 另一种类型 在 package内的 像 action,interceptor,result等都是在package中的,可以利用extend机制继承实现复用