网站logo是指,手机上做app的软件,网站域名和空间,网站怎么做内链接1.1 Struts2初始化 在讲Struts2的初始化之前#xff0c;应该为大家描述下Web应用中的过滤器Filter#xff0c;这关系到我们对核心过滤器FilterDispatcher的正确理解。 Filter#xff1a;一个filter是一个对象#xff0c;为每个请求资源(一个servlet或静态内容) #xff0c…1.1 Struts2初始化 在讲Struts2的初始化之前应该为大家描述下Web应用中的过滤器Filter这关系到我们对核心过滤器FilterDispatcher的正确理解。 Filter一个filter是一个对象为每个请求资源(一个servlet或静态内容) 或响应一个资源或两者用于执行过滤任务。过滤器执行过滤是在doFilter方法中。每个过滤器方法访问一个FilterConfig对象从中获取初始化参数filterConfig.getServletContext()可以获得ServletContext对象使用。过滤器的配置在Web应用程序的web.xml中。 init()初始化过滤器它的输入参数javax.servlet.FilterConfig的一个实例可以在这里初始化过滤要使用到的FilterConfig。该方法由Web容器自动调用。 doFilter()进行具体的过滤操作这个方法以javax.servlet.ServletRequest请求信息 javax.servlet.ServletResponse响应信息javax.servlet.FilterChain过滤链。过滤链在Web应用程序中所有的过滤器会构成一个链状符合过滤条件的程序将会根据定义的顺序执行所有链中的过滤器。在这个方法中调用FilterChain的 doFilter(javax.servlet.ServletRequest, javax.servlet.SerletResponse)方法就可以传递到链中的下一个过滤器。 destory()销毁过滤器可以在这里释放使用完的资源例如设置过滤器中FilterConfig为null。 综上所述在Web应用启动时会默认初始化Filter调用Filter的init(FilterConfig filterConfig)方法当请求到来时会按顺序执行web.xml中所配置Filter的doFilter(ServletRequest req, ServletResponse res, FilterChain chain)方法。 Struts2的核心过滤器FilterDispatcher实现的就是StrutsStatics, Filter接口所以它本质就是一个过滤器如下图所示 所以Struts2的初始化工作在Web应用启动时就可以通过FilterDispatcher核心过滤器init(FilterConfig filterConfig)方法来完成了。如下图所示 FilterDispatcher.init(FilterConfig filterConfig)方法中主要工作分为 a) 创建Dispatcher类对象将FilterDispatcher配置的初始化参数传到该对象中 b) 加载并解析配置文件配置文件分为属性配置文件、Bean配置文件两种。Struts2的配置文件包括系统默认的配置文件 default.properties、struts-default.xml以及插件配置文件、应用配置文件struts-plugin.xml、struts.xml、struts.properties、web.xml。那么这六种配置文件的加载顺序如下 1. default.properties 2. struts-default.xml 3. struts-plugin.xml 4. struts.xml 5. struts.properties 6. web.xml 加载顺序如下图所示 c) 加载静态资源配置参数: packages该参数用来配置自动搜寻目录 小提示 FilterDispatcher 实现的StrutsStatics接口没有定义业务方法只定义了若干个常量。Struts2对常用的接口进行了重新封装比如HttpServletRequest、HttpServletResponse、HttpServletContext等。如下图所示 1.2 Struts2初始化源码分析 1. Struts2 Web应用启动时根据web.xml配置的核心过滤器FilterDispatcher会初始化FilterDispatcher 2. 正如我们知道的过滤器初始化时会自动调用init()方法进行初始化工作所以在FilterDispatcher启动时会自动调用init(FilterConfig filterConfig)方法进行Struts2的初始化首先在该方法中会创建org.apache.struts2.Dispatcher对象将FilterDispatcher配置的初始化参数传到该对象中然后调用dispatcher.init()方法加载并解析配置文件最后加载静态资源配置参数packages。org.apache.struts2.dispatcher.FilterDispatcher.java源码如下图所示 3. 在FilterDispatcher.init()方法中首先创建Dispatcher类对象并将FilterDispatcher配置的初始化参数传到对象中相关代码如下图所示 4. 然后通过dispatcher.init()方法加载并解析Struts2配置文件配置文件的加载与解析是由Provider类来实现完成的所以可分为两步加载配置Provider、解析配置Provider具体处理步骤如下 a) 创建com.opensymphony.xwork2.config.ConfigurationManager,其中属性ListContainerProvider containerProviders存放所有配置Provider。 b) init_DefaultProperties()初始化一个用来加载default.properties的DefaultPropertiesProvider并存入至containerProviders。 c) init_TraditionalXmlConfigurations()默认根据struts-default.xml,struts-plugin.xml,struts.xml 可根据init-param:config 修改加载路径 分别创建三个 org.apache.struts2.config. StrutsXmlConfigurationProvider并存入至containerProviders。 d) init_LegacyStrutsProperties()初始化初始化一个用来加载struts.properties的LegacyPropertiesConfigurationProvider并存入至containerProviders。 e) init_CustomConfigurationProviders()根据init-paramconfigProviders初始化一个用户自定义实现的ConfigurationProvider接口的Provider并存入至containerProviders。 f) init_FilterInitParameters()初始化一个用来加载web.xml中initParams配置的ConfigurationProvider, 并存入至containerProviders。 g) init_AliasStandardObjects() 初始化一个用来为所配置的Bean与具体类映射的BeanSelectionProvider并存入至containerProviders。 h) init_PreloadConfiguration()以上几步存入ConfigurationProvider对象完毕后按顺序循环调用上面几步存入的ConfigurationProvider的register、loadPackages、addPackage方法先加载先解析进行解析配置Provider。 小提示 1. 加载配置Provider其实就是加载配置文件 2. 解析配置Provider其实就是解析配置文件 下面列出以上a-h步的相关代码如下图所示 1. Struts2中dispatcher.init()代码 2. Struts2中init_PreloadConfiguration()方法代码 3. XWork中configurationManager.getConfiguration()方法代码 4. XWork中configuration.reloadContainer()方法代码 5. Xwork中XmlConfigurationProvider.loadPackages()方法代码 6. Xwork中XmlConfigurationProvider.addPackage ()方法代码 4. 最后通过staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig))加载静态资源配置参数packages值得注意的是还有另外三个固定的包和该参数进行拼接分别是org.apache.struts2.static、template、和org.apache.struts2.interceptor.debugging中间用空格隔开经过解析将包名变成路径后存储到一个名叫pathPrefixes的数组中这些目录中的文件会被自动搜寻相关代码如下图所示 注 关于源码分析大概分为两种流程源码分析、过程源码分析因本人的初衷是流程源码分析所以以上的分析是根据初始化处理流程顺序来进行分析的并未对各个方法的过程细节做深入的讲解望见谅。转载于:https://www.cnblogs.com/mktao/archive/2012/08/30/2664296.html