ImageVerifierCode 换一换
格式:DOC , 页数:32 ,大小:829KB ,
资源ID:3523868      下载积分:15 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3523868.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Struts2框架流程详细分析.doc)为本站会员(11****ws)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

Struts2框架流程详细分析.doc

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个工作日内予以改正。