1、StrutsPrepareAndExecuteFilter 实现了 Filter 接口 init 方法为初始化入口StrutsPrepareAndExecuteFilter init 方法 1. public void init(FilterConfig filterConfig) throws ServletException 2. /初始化辅助类 类似一个 Delegate 3. InitOperations init = new InitOperations(); 4. try 5. / FilterHostConfig 封装了 FilterConfig 参数对象 6. FilterHo
2、stConfig config = new FilterHostConfig(filterConfig); 7. /LoggerFactory 配置加载 8. /如果没有 web.xml 没有配置“loggerFactory”参数 尝试 mons.logging.LogFactory9. /如果失败 使用 JdkLoggerFactory 10. /TODO SPI 11. init.initLogging(config); 12. /TODO 创建 Dispatcher 注册加载器 执行加载器 创建容器 解析 xml 13. Dispatcher dispatcher = init.init
3、Dispatcher(config); 14. init.initStaticContentLoader(config, dispatcher); 15. /预处理类 请求处理时才会真正用到 16. /1.主要负责在每次请求 创建 ActionContext 清除 ActionContext 17. /2.当接收到一个请求时 通过 uri 查找 ActionConfig 创建 ActionMapping 18. prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); /处理请求 Delegat
4、e 19. execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); 20. /空实现 留作扩展 21. postInit(dispatcher, filterConfig); 22. finally 23. init.cleanup(); 24. 25. InitOperations 类似与一个 Delegate 主要负责实例化 Dispatche 再把初始化
5、操作转交给 Dispatche init 处理1. public Dispatcher initDispatcher( HostConfig filterConfig ) 2. /创建 Dispatcher 3. Dispatcher dispatcher = createDispatcher(filterConfig); 4. /核心方法 Container 容器的创建 xml 解析在此方法发生 5. dispatcher.init(); 6. return dispatcher; 7. 8. 9. private Dispatcher createDispatcher( HostConfi
6、g filterConfig ) 10. Map params = new HashMap(); 11. for ( Iterator e = filterConfig.getInitParameterNames(); e.hasNext(); ) 12. String name = (String) e.next(); 13. String value = filterConfig.getInitParameter(name); 14. params.put(name, value); 15. 16. return new Dispatcher(filterConfig.getServlet
7、Context(), params); 17. Dispatcher init 方法 1.针对配置文件 注册不同的加载器 保存到 ConfigurationManager 类中的一个变量中 2.创建容器 解析 xml1. public void init() 2. /创建配置操作管理类 , 会保存元素加载器 3. if (configurationManager = null) 4. configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME); 5. 6. try 7. /
8、*初始化各种形式加载器,保存到 ConfigurationManager#containerProviders Map 集合中 8. 没有真正执行加载 解析逻辑*/ 9. /org/apache/struts2/default.properties 属性文件 里面定义了一系列 struts 常量 10. init_DefaultProperties(); / 1 11. /web.xml 配置的 config 参数 配置多个用“,“分开 12./如果没有该参数 默认为 struts-default.xml框架级 ,struts-plugin.xml框架级,struts.xml系统级别13. /
9、根据文件名称 创建加载器 加载 xml 主要有一下两个解析器 14. /XmlConfigurationProviderxwork.xml, 15. /StrutsXmlConfigurationProviderstruts 相关配置文件 配置元素加载器 16. init_TraditionalXmlConfigurations(); / 2 17. /struts.locale 注册 18. init_LegacyStrutsProperties(); / 3 19. /实例化 我们自定义的加载器 保存到 containerProviders 集合中 20. / web.xml config
10、Providers 参数 多个用“,“分开 21. /配置器必须是 ConfigurationProvider 接口的实例 22. /TODO SPI 23. init_CustomConfigurationProviders(); / 5 24. /web.xml 配置的 init-param 参数 加载器 最终会保存到 Container 容器中 25. init_FilterInitParameters() ; / 6 26. /TODO 根据我们在 struts.xml 定义的 常量 选择插件类 27. /比如集成 spring 会用到 org.apache.struts2.sprin
11、g.StrutsSpringObjectFactory 28. init_AliasStandardObjects() ; / 7 29. /* 执行加载器 */ 30. /TODO 创建容器 解析 xml 真正执行加载器方法 31. Container container = init_PreloadConfiguration(); 32. /执行当前 Dispatcher 对象 依赖关系注入 33. container.inject(this); 34. /额外动作 35. init_CheckConfigurationReloading(container); 36. init_Chec
12、kWebLogicWorkaround(container); 37. catch (Exception ex) 38. if (LOG.isErrorEnabled() 39. LOG.error(“Dispatcher initialization failed“, ex); 40. throw new StrutsException(ex); 41. 42. ConfigurationManager 主要管理 创建的各种加载器1. public class ConfigurationManager 2. protected static final Logger LOG = Logger
13、Factory.getLogger(ConfigurationManager.class); 3. /配置元素管理器 4. protected Configuration configuration; 5. protected Lock providerLock = new ReentrantLock(); 6. /创建的 xml 加载器会保存到次集合中 7. private List containerProviders = new CopyOnWriteArrayList(); Dispatcher 的 createConfigurationManager 方法1. protected C
14、onfigurationManager createConfigurationManager(String name) 2. /name - struts 3. return new ConfigurationManager(name); 4. 1.default.properties 属性文件加载器1. private void init_DefaultProperties() 2. /保存到 ConfigurationManager 加载器集合中 3. configurationManager.addConfigurationProvider(new DefaultPropertiesPr
15、ovider(); 4. 2.创建 struts 相关文件加载器 StrutsXmlConfigurationProvider 1. private void init_TraditionalXmlConfigurations() 2. /web.xml 配置的 config 3. String configPaths = initParams.get(“config“); 4. if (configPaths = null) 5. /如果没有配置 默认 struts-default.xml,struts-plugin.xml,struts.xml 6. configPaths = DEFAU
16、LT_CONFIGURATION_PATHS; 7. 8. String files = configPaths.split(“s*,s*“); 9. for (String file : files) 10. if (file.endsWith(“.xml“) 11. if (“xwork.xml“.equals(file) 12. configurationManager.addConfigurationProvider(createXmlConfigurationProvider(file, false); 13. else 14. /struts xml 加载器 15. /Struts
17、XmlConfigurationProvider 16. configurationManager.addConfigurationProvider(createStrutsXmlConfigurationProvider(file, false, servletContext); 17. 18. else 19. throw new IllegalArgumentException(“Invalid configuration file name“); 20. 21. 22. 23.protected XmlConfigurationProvider createXmlConfigurati
18、onProvider(String filename, booleanerrorIfMissing) 24. return new XmlConfigurationProvider(filename, errorIfMissing); 25. 26.protected XmlConfigurationProvider createStrutsXmlConfigurationProvider(String filename, boolean errorIfMissing, ServletContext ctx) 27. return new StrutsXmlConfigurationProvi
19、der(filename, errorIfMissing, ctx); 28. 3.web.xml 扩展的 ContainerProviders 加载器 实例化1. private void init_CustomConfigurationProviders() 2. /web.xml 中 configProviders 节点 3. String configProvs = initParams.get(“configProviders“); 4. if (configProvs != null) 5. String classes = configProvs.split(“s*,s*“);
20、6. for (String cname : classes) 7. Class cls = ClassLoaderUtils.loadClass(cname, this.getClass(); 8. ConfigurationProvider prov = (ConfigurationProvider)cls.newInstance(); 9. configurationManager.addConfigurationProvider(prov); 10. 11. 12. init_PreloadConfiguration 方法主要完成创建容器, 解析 xml 动作1. private Co
21、ntainer init_PreloadConfiguration() 2. /创建 Container 解析 xml 3. Configuration config = configurationManager.getConfiguration(); 4. Container container = config.getContainer(); 5. boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD); 6. Localized
22、TextUtil.setReloadBundles(reloadi18n); 7. return container; 8. init_PreloadConfiguration 方法中调用了 ConfigurationManager 的 getConfiguration 方法1. public synchronized Configuration getConfiguration() 2. /创建配置元素管理器 3. if (configuration = null) 4. / defaultFrameworkBeanName - struts 5. setConfiguration(crea
23、teConfiguration(defaultFrameworkBeanName); 6. try 7. / getContainerProviders 返回注册的各种加载器 8. / reloadContainer 创建 Container 解析 xml 9. configuration.reloadContainer(getContainerProviders(); 10. catch (ConfigurationException e) 11. setConfiguration(null); 12. throw new ConfigurationException(“Unable to
24、load configuration.“, e); 13. 14. else 15. conditionalReload(); 16. 17. return configuration; 18. java view plaincopyprint?1. protected Configuration createConfiguration(String beanName) 2. return new DefaultConfiguration(beanName); 3. DefaultConfiguration 的 reloadContainer 方法 会去执行已注册的各种加载器 ,和创建容器1.
25、 public synchronized List reloadContainer(List providers) throws ConfigurationException 2. packageContexts.clear(); 3. loadedFileNames.clear(); 4. List packageProviders = new ArrayList(); 5. / 保存 struts 常量 6. ContainerProperties props = new ContainerProperties(); 7. /容器构建器 8. ContainerBuilder builde
26、r = new ContainerBuilder(); 9. for (final ContainerProvider containerProvider : providers) 10. /* 11. * 初始化 Document 准备解析 12. * 具体在 XmlConfigurationProvider 实现类 会处理 include 节点 13. * 处理完成之后 Document 会保存到 XmlConfigurationProvider#documents list 集合中 14. * include file 路径会保存到 XmlConfigurationProvider#lo
27、adedFileUrls set 集合中 15. * 从代码中发现 include file 属性中 可以使用通配符 “*“ 16. */ 17. /* StrutsXmlConfigurationProvider 是 XmlConfigurationProvider 的子类 */ 18. /* StrutsXmlConfigurationProvider struts*.xml */ 19. containerProvider.init(this); 20. /针对“bean“,“constant“,“unknown-handler-stack“节点 不包括“package“节点 解析 xm
28、l 21. /每一个 bean 对应一个 LocatableFactory LocatableFactory 保存了 bean 的定义 22. /bean 定义 保存到 ContainerBuilder#factories map 集合中 23. /配置文件中定义的常量 保存到 props 中 24. containerProvider.register(builder, props); 25. 26. /将常量保存到 ContainerBuilder#factories map 集合中 27. /每一个常量对应一个 LocatableConstantFactory 28. props.set
29、Constants(builder); 29. builder.factory(Configuration.class, new Factory() 30. public Configuration create(Context context) throws Exception 31. return DefaultConfiguration.this; 32. 33. ); 34. ActionContext oldContext = ActionContext.getContext(); 35. try 36. /创建辅助容器 ContainerImpl 并且 实例化 struts 一些核
30、心类 37. Container bootstrap = createBootstrapContainer(); 38. setContext(bootstrap); 39. /主容器 这是一个全局变量 40. container = builder.create(false); 41. setContext(container); 42. objectFactory = container.getInstance(ObjectFactory.class); 43. / Process the configuration providers first 44. for (final Conta
31、inerProvider containerProvider : providers) 45. if (containerProvider instanceof PackageProvider) 46. /com.opensymphony.xwork2.config.providers.XmlConfigurationProvider#setObjectFactory(ObjectFactory) 47. container.inject(containerProvider); 48. /解析 xml package 节点 49. /保存 packageContexts map 集合中 50.
32、 /com.opensymphony.xwork2.config.providers.XmlConfigurationProvider line 481 (PackageProvider) containerProvider).loadPackages(); 51. packageProviders.add(PackageProvider) containerProvider); 52. 53. 54. / Then process any package providers from the plugins 55. Set packageProviderNames = container.g
33、etInstanceNames(PackageProvider.class); if (packageProviderNames != null) 56. for (String name : packageProviderNames) 57. PackageProvider provider = container.getInstance(PackageProvider.class, name); 58. provider.init(this); 59. provider.loadPackages(); 60. packageProviders.add(provider); 61. 62.
34、63. /TODO 64. rebuildRuntimeConfiguration(); 65. finally 66. if (oldContext = null) 67. ActionContext.setContext(null); 68. 69. 70. return packageProviders; 71. StrutsXmlConfigurationProvider 的 init 方法 具体在父类 XmlConfigurationProvider 中实现1. public void init(Configuration configuration) 2. this.configu
35、ration = configuration; 3. this.includedFileNames = configuration.getLoadedFileNames(); 4. / configFileName -struts.xml 5. /1.递归处理 include 节点 6. /2.生成 Document 集合 7. loadDocuments(configFileName); 8. loadDocuments 方法中调用了 loadConfigurationFiles 方法 返回一个 Document 集合1. private void loadDocuments(String
36、configFileName) 2. loadedFileUrls.clear(); 3. /List documents 4. documents = loadConfigurationFiles(configFileName, null); 5. loadConfigurationFiles 方法 递归处理 include 节点 最终生成 Document 集合1. private List loadConfigurationFiles(String fileName, Element includeElement) 2. List docs = new ArrayList(); 3. L
37、ist finalDocs = new ArrayList(); 4. /防止 include 重复引入 5. if (!includedFileNames.contains(fileName) 6. if (LOG.isDebugEnabled() 7. LOG.debug(“Loading action configurations from: “ + fileName); 8. 9. includedFileNames.add(fileName); 10. Iterator urls = null; 11. InputStream is = null; 12. IOException i
38、oException = null; 13. try 14. urls = getConfigurationUrls(fileName); 15. catch (IOException ex) 16. ioException = ex; 17. 18. if (urls = null | !urls.hasNext() 19. if (errorIfMissing) 20.throw new ConfigurationException(“Could not open files of the name “ + fileName, ioException); else 21. LOG.info
39、(“Unable to locate configuration files of the name “ + fileName + “, skipping“); return docs; 22. 23. 24. URL url = null; 25. while (urls.hasNext() 26. try 27. url = urls.next(); 28. is = FileManager.loadFile(url); 29. InputSource in = new InputSource(is); 30. in.setSystemId(url.toString(); 31. /生成 Document 对象 32. docs.add(DomHelper.parse(in, dtdMappings); 33. catch (XWorkException e) 34. if (includeElement != null) 35. throw new ConfigurationException(“Unable to load “ + url, e, includeElement); else 36. throw new ConfigurationExceptio
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。