Tiles框架實(shí)現(xiàn)原理剖析_第1頁
Tiles框架實(shí)現(xiàn)原理剖析_第2頁
Tiles框架實(shí)現(xiàn)原理剖析_第3頁
Tiles框架實(shí)現(xiàn)原理剖析_第4頁
Tiles框架實(shí)現(xiàn)原理剖析_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Tiles框架實(shí)現(xiàn)原理剖析Struts1.3整合tiles框架實(shí)現(xiàn)過程源碼剖析Contribute:shimanan Date:2013-10 Address:hubei province hongan county Email: qq:24278572101解決問題Tiles框架,主要是提供頁面布局文件功能,就像提供html、jsp頁面一樣。但它與html、jsp相比,主要不同是,將頁面不同部分(左邊、上邊、頁頭、頁腳、中間body部分),叫局部頁面,組合形成最終html或jsp頁面,以提供相同局部代碼復(fù)用功能。請大家從網(wǎng)上收集資料進(jìn)行學(xué)習(xí)。這里不是講tiles框架如何使用及基本功能,而是從

2、分析源代碼角度,通過tiles整合到struts1實(shí)例,剖析tiles框架實(shí)現(xiàn)過程。目前網(wǎng)上搜索不到這部分內(nèi)容,tiles最先使用到struts1中,現(xiàn)在隨著liferay的火爆,tiles正逐步被大家使用,它與velocity、framemaker等都提供view功能,可以說是VIEW家族三駕馬車,雖然大家知道怎樣使用,但為什么要這樣使用,及它如何實(shí)現(xiàn)的。我們只有從根本上了解,才能促進(jìn)工作事半功倍。借此進(jìn)一步了解框架整合過程,了解view層整合原理。2ActionServlet初始化中與tiles相關(guān)部分的實(shí)現(xiàn)ActionServlet使用Digester解析struts-config.xm

3、l文件,Digester的使用網(wǎng)上有專業(yè)老師視頻,請不熟悉的下載看看。public class ActionServlet extends HttpServlet public void init() throws ServletException ModuleConfig moduleConfig = initModuleConfig(“”, config);/該步解析struts-config.xml文件,使用到Digester,最后生成ModuleConfig 對象,這是struts1.3在整個工作中要用到的對象,實(shí)際上是struts-config.xml的一個對應(yīng)對象,放在內(nèi)存中,st

4、ruts-config.xml中有什么配置,ModuleConfig就有相應(yīng)的屬性對象。該文主要將tiles,因此下面就著重講與之相關(guān)的controller和plug-in的初始化。.initModulePlugIns(moduleConfig); /流程還沒執(zhí)行到該步,后面要使用到初始化插件,待會再講3下面先貼出需要解析的strus-config.xml的代碼片段:/請求轉(zhuǎn)發(fā)控制器,替換掉struts1.3默認(rèn)的RequestProcessor/TilesPlugin, definitions-config為配置文件, moduleAware為ModuleConfig允許使用多個,對應(yīng)的每個

5、ModuleConfig將產(chǎn)生相應(yīng)的tiles的DefinitionsFactory,DefinitionsFactory實(shí)際上就是一個set,里面與tiles-defs.xml文件對應(yīng),對應(yīng)每個name,就有一個definition與之匹配。后面講詳細(xì)講解。protected ModuleConfig initModuleConfig(String prefix, String paths) throws ServletException / Configure the Digester instance we will use . Digester digester = initConfi

6、gDigester(); /使用Digester處理struts-config.xml文件 4 protected Digester initConfigDigester() throws ServletException . configDigester.addRuleSet(new ConfigRuleSet(); /過程調(diào)用,可略過不看Controller部分 與后面 plug-in分開講public class ConfigRuleSet extends RuleSetBase . public void addRuleInstances(Digester digester) Clas

7、sLoader cl = digester.getClassLoader(); . digester.addObjectCreate(struts-config/controller, org.apache.struts.config.ControllerConfig, className); digester.addSetProperties(struts-config/controller); digester.addSetNext(struts-config/controller, setControllerConfig, org.apache.struts.config.Control

8、lerConfig); digester.addRule(struts-config/controller/set-property, new BaseConfigSetPropertyRule(); . 將上面貼出的struts-config.xml中有關(guān)controller的配置片段重新貼處理,對照看 . /請求轉(zhuǎn)發(fā)控制器,替換掉struts默認(rèn)的equestProcessor5 上面代碼,其意思為:告訴Digester:如果遇到匹配“struts-config/controller”形式的節(jié)點(diǎn),就執(zhí)行一個“對象創(chuàng)建”操作,創(chuàng)建org.apache.struts.config.Contro

9、llerConfig的對象, digester.addSetProperties執(zhí)行后,設(shè)置ControllerConfig的屬性digester.addSetNext執(zhí)行后,將剛才創(chuàng)建的ControllerConfig對象放入ModuleConfig中。如下:public class ControllerConfig extends BaseConfig String processorClass = “ =“ org.apache.struts.tiles. TilesRequestProcessor ”;/digester執(zhí)行后的值 String contentType = “text/

10、html; charset=UTF-8”; /digester執(zhí)行后的值 public class ModuleConfigImpl extends BaseConfig implements Serializable, ModuleConfig protected ControllerConfig controllerConfig = null; public ControllerConfig getControllerConfig() return (this.controllerConfig); public void setControllerConfig(ControllerConf

11、ig cc) this.controllerConfig = cc; . 6plug-in部分 與前面Controller部分分開講public class ConfigRuleSet extends RuleSetBase . public void addRuleInstances(Digester digester) ClassLoader cl = digester.getClassLoader(); . digester.addObjectCreate(struts-config/plug-in, org.apache.struts.config.PlugInConfig); dig

12、ester.addSetProperties(struts-config/plug-in); digester.addSetNext(struts-config/plug-in, addPlugInConfig, org.apache.struts.config.PlugInConfig); digester.addRule(struts-config/plug-in/set-property, new PlugInSetPropertyRule(); . 將上面貼出的struts-config.xml中有關(guān)plug-in的配置片段重新貼處理,對照看 . 7 上面代碼,其意思為:告訴Diges

13、ter:如果遇到匹配“struts-config/plug-in”形式的節(jié)點(diǎn),就執(zhí)行一個“對象創(chuàng)建”操作,創(chuàng)建org.apache.struts.config.PlugInConfig的對象, digester.addSetProperties執(zhí)行后,設(shè)置PlugInConfig的屬性digester.addSetNext執(zhí)行后,將剛才創(chuàng)建的PlugInConfig對象放入ModuleConfig中。如下:public class PlugInConfig implements Serializable String className=“org.apache.struts.tiles.Til

14、esPlugin”;/ , digester.addSetProperties執(zhí)行后的值, protected Map properties = new HashMap(); /該對象存在的語句 map properties /(key ,value) 形式存在于map中,這是digester.addRule(“struts-config/plug-in/set-property”, new PlugInSetPropertyRule();執(zhí)行后的結(jié)果,通過public void addProperty(String name, String value) properties.put(nam

15、e, value);將下面的值添加到map中。 (definitions-config, “/WEB-INF/tiles-defs.xml,/WEB- INF/tiles-defs-ext.xml” ) /(key ,value) (moduleAware,true) /(key ,value) (definitions-parser-validate ,true) /(key ,value) public class ModuleConfigImpl extends BaseConfig implements Serializable, ModuleConfig PlugInConfig f

16、indPlugInConfigs(); /以array的形式放入PlugInConfig 中 void addPlugInConfig(PlugInConfig plugInConfig); PlugInConfig findPlugInConfigs(); . 上面通過Digester解析struts-config.xml, 產(chǎn)生與之匹配的moduleConfig對象?;氐紸ctionServlet ,執(zhí)行后續(xù)的函數(shù)initModulePlugIns8protected void initModulePlugIns(ModuleConfig config) throws ServletExc

17、eption /前面第3頁對這行有提示 PlugInConfig plugInConfigs = config.findPlugInConfigs(); /上頁產(chǎn)生的pluginConfigs數(shù)組對象 PlugIn plugIns = new PlugInplugInConfigs.length; for (int i = 0; i plugIns.length; i+) /這里以Tiles 插件為例,其他插件一樣 plugInsi =(PlugIn) RequestUtils.applicationInstance(plugInConfigsi.getClassName();/ 前面講過ti

18、les插件的PlugInConfig ,其對象的className=“org.apache.struts.tiles.TilesPlugin,這里的puugini對象就是org.apache.struts.tiles.TilesPlugin對象實(shí)例。對這句應(yīng)該沒問題吧? BeanUtils.populate(plugInsi, plugInConfigsi.getProperties();/將TilesPlugin對象的屬性填充 (definitions-config, “/WEB-INF/tiles-defs.xml,/WEB- INF/tiles-defs-ext.xml” ) /(key

19、 ,value) (moduleAware,true) /(key ,value) (definitions-parser-validate ,true) /(key ,value) PropertyUtils.setProperty(plugInsi, “currentPlugInConfigObject”, plugInConfigsi); /這行特重要,將tiles插件配置對象pluginConfig以currentPlugInConfigObject屬性保持在tiles插件實(shí)例中,后面會用到該屬性,在緊接著plugInsi.init(this, config)執(zhí)行中,以這個屬性重新生成

20、一新的對象,叫DefinitionsFactoryConfig對象,幫你這樣理解,該DefinitionsFactoryConfig中有屬性definitions-config,其值“/WEB-INF/tiles-defs.xml,通過該屬性,再通過讀文件工具,最后生成以tiles-defs.xml文件中對應(yīng)的 (key:name value:define instance) 的 set ,名字叫 defines,最后通過rquestDispatcher(請求派發(fā)工具),在defines 中搜索key(就是name) 頁面html或jsp (define instance 對象中有屬性path

21、,指向頁面值)。 . plugInsi.init(this, config); /這步就是TilesPlugin.init(this,config); 9. plugInsi.init(this, config); /這步就是TilesPlugin.init(this,config);public void init(ActionServlet servlet, ModuleConfig moduleConfig) throws ServletException / 創(chuàng)建tiles “definition工廠配置”對象,就是tiles_def.xml中的 ,每項(xiàng)就是一個definition,不

22、好翻譯。 DefinitionsFactoryConfig factoryConfig = readFactoryConfig(servlet, moduleConfig); / DefinitionsFactoryConfig 中有一屬性叫factoryName,其值與moduleConfig的prefix對映,一般不會用到多moduleConfig,這里為“”,即空。 factoryConfig.setFactoryName(moduleConfig.getPrefix(); / 將前面初始化moduleConfig的ControllerConfig 對象及 org.apache.stru

23、ts.tiles. TilesRequestProcessor 設(shè)置為ActionServlet的ReuqestDispatcher,這個控制器挺重要,后面講到,TilesPlugin初始化中讀取tiles-def.xml,生成的set(就是defines,key:name ,value:define instance ,define instance中有屬性path,對應(yīng)返回頁面地址),這個set就是TilesRequestProcessor 要使用的資源。如果這個set中沒有返回頁面,就按sturs1.3中的ReuqestDispatcher處理,搜索moduleConfig的Forwar

24、dConfig,按(key:路徑path,value:頁面)的形式執(zhí)行。); this.initRequestProcessorClass(moduleConfig10 接上面 這步是為下步做準(zhǔn)備,主要語句TilesUtil.setTilesUtil(new TilesUtilStrutsModulesImpl();,執(zhí)行后,TilesUtil中屬性tilesUtilImpl= TilesUtilStrutsModulesImpl instance this.initTilesUtil();這步是主要工作,通過參數(shù)moduleConfig(對應(yīng)struts-config.xml),factor

25、yConfig( 包含TilesPlugin 配置參數(shù)的definition 工廠配置,主要是參數(shù)definitions-config“ 值為”/WEB-INF/tiles-defs.xml),該程序主要工作就是讀取tiles-defs.xml中每個definition,以name為key的DefinitionsFactory,實(shí)際上就是set對象。 this.initDefinitionsFactory(servlet.getServletContext(), moduleConfig, factoryConfig); 下面主要講解this.initDefinitionsFactory(se

26、rvlet.getServletContext(), moduleConfig, factoryConfig);涉及到前面的內(nèi)容,再提到,實(shí)際上通過這個函數(shù)的講解,你們就能掌握前面的函數(shù)。11 private void initDefinitionsFactory( ServletContext servletContext, ModuleConfig moduleConfig, DefinitionsFactoryConfig factoryConfig) throws ServletException / 創(chuàng)建finition 工廠類,就是最后的set ,即defines,有這個類,后面就

27、可以通過讀取tiles-def.xml,將(name ,definition) 一項(xiàng)項(xiàng)填充進(jìn)來,通過下步程序,知道definitionFactory =org.apache.struts.tiles.xmlDefinition.I18nFactorySet,這個set是i18n set,具有國際化功能,及tiles-def.xml可帶locale,例如tiles-def_zh-CN.xml等。 try definitionFactory = TilesUtil.createDefinitionsFactory(servletContext, factoryConfig); catch (Def

28、initionsFactoryException ex) public static DefinitionsFactory createDefinitionsFactory( ServletContext servletContext, DefinitionsFactoryConfig factoryConfig) throws DefinitionsFactoryException /實(shí)際上調(diào)用下面行 return tilesUtilImpl.createDefinitionsFactory(servletContext, factoryConfig); 12public class Def

29、initionsFactoryConfig implements Serializable /這個類I18nFactorySet很重要,實(shí)際上tiles plugin 最終就是要讀取tiles_def.xml中的數(shù)據(jù),填充到該類中,該類是一個set 類對象,下面要用到該factoryClassname 屬性,通過該屬性生成I18nFactorySet對象 protected String factoryClassname = org.apache.struts.tiles.xmlDefinition.I18nFactorySet;protected DefinitionsFactory cre

30、ateDefinitionFactoryInstance(String classname) throws DefinitionsFactoryException try /就是上面說的classname =factoryClassname factoryClassname =I18nFactorySet Class factoryClass = RequestUtils.applicationClass(classname); Object factory = factoryClass.newInstance(); /生成I18nFactorySet的類對象,就是DefinitionsFac

31、tory catch if (factory instanceof ComponentDefinitionsFactory) / 該方法向后兼容,實(shí)際上后面ComponentDefinitionsFactoryWrapper.init,就是調(diào)用 factory.initFactory(servletContext, createConfigMap(config),這步可沒少我花時間,總以為是 factory.init,一直沒找到,后發(fā)現(xiàn)時initFactory方法,真夠嗆。這里factory=I18nFactorySet factory = new ComponentDefinitionsFa

32、ctoryWrapper( (ComponentDefinitionsFactory) factory); return (DefinitionsFactory) factory;準(zhǔn)備工作,為后面程序使用13public DefinitionsFactory createDefinitionsFactory( ServletContext servletContext, DefinitionsFactoryConfig factoryConfig) throws DefinitionsFactoryException / 這步上面講過,可參考上頁準(zhǔn)備工作 DefinitionsFactory

33、factory = createDefinitionFactoryInstance(factoryConfig.getFactoryClassname(); /上頁講過,實(shí)際上調(diào)用org.apache.struts.tiles.xmlDefinition.I18nFactorySet.initFctory. (servletContext, createConfigMap(config); createConfigMap(config)下面單獨(dú)講 factory.init(factoryConfig, servletContext); /后面將講I18nFactorySet.initFctor

34、y. (servletContext, eateConfigMap(config); / Make factory accessible from jsp tags (push it in appropriate context) makeDefinitionsFactoryAccessible(factory, servletContext); return factory; 14 public static Map createConfigMap(DefinitionsFactoryConfig config) / Map map = new HashMap(config.getAttri

35、butes(); / Add property attributes using old names map.put( DefinitionsFactoryConfig.DEFINITIONS_CONFIG_PARAMETER_NAME, config.getDefinitionConfigFiles(); map.put( DefinitionsFactoryConfig.PARSER_VALIDATE_PARAMETER_NAME, (config.getParserValidate() ? boolean.TRUE.toString() : Boolean.FALSE.toString(

36、);/下面判斷是對的,就不執(zhí)行中間代碼 if (!org.apache.struts.tiles.xmlDefinition.I18nFactorySet .equals(config.getFactoryClassname() map.put( DefinitionsFactoryConfig.FACTORY_CLASSNAME_PARAMETER_NAME, config.getFactoryClassname(); return map; 上面代碼的作用就是講DefinitionsFactoryConfig的屬性(key,value)傳遞到map,e.g: definitions-con

37、fig 對應(yīng) definitionConfigFiles的值, 實(shí)際上就是=“/WEB-INF/tiles-defs.xml” . ,這里大家有疑問,明明DefinitionsFactoryConfig中是definitions-config,為何變?yōu)閐efinitionConfigFiles呢?其實(shí),在TilesPlugin.init中, DefinitionsFactoryConfig factoryConfig = readFactoryConfig(servlet, moduleConfig);進(jìn)行過一此變換,大家可進(jìn)去看看。 definitions-parser-validate 對

38、應(yīng) parserValidate 實(shí)際上等于 true15public class I18nFactorySet extends FactorySet public void initFactory(ServletContext servletContext, Map properties) throws DefinitionsFactoryException / definitions-parser-validate =true ,實(shí)際取值,即在解析tiles-def.xml時,是否驗(yàn)證 String value = (String) properties.get(PARSER_VALIDA

39、TE_PARAMETER_NAME); if (value != null) isValidatingParser = Boolean.valueOf(value).booleanValue(); / isValidatingParser =值 /definitions-parser-details 參數(shù)指定當(dāng)定義文件被解析時所需要的調(diào)試信息的層次,該值傳給Commons Digester。所允許的值同definitions-debug參數(shù),缺省值為0。 value = (String) properties.get(PARSER_DETAILS_PARAMETER_NAME); if (va

40、lue != null) try parserDetailLevel = Integer.valueOf(value).intValue();/ definitions-parser-details的取值 catch (NumberFormatException ex) /上面不重要,只是取不很重要的屬性16/ DEFINITIONS_CONFIG_PARAMETER_NAME= definitions-config,/definitions-config =“ /WEB-INF/tiles-defs.xml,/WEB-INF/tiles-defs-ext.xml “ ,就對應(yīng)definiti

41、ons-config String = (String) properties.get(DEFINITIONS_CONFIG_PARAMETER_NAME); if ( != null) / Use provided try /這是最主要的程序,通過對的操作,對definitionFaction進(jìn)行初始化。實(shí)際是采用struts1.3常用的Digester,通過rule來解析tiles-def.xml initFactory(servletContext, ); if (log.isDebugEnabled() catch ( ex) / A is specified, throw appro

42、priate error. else / 如果前面沒提供,就采用DEFAULT_DEFINITION_里面的文件,“/WEB-INF/tileDefinitions.xml”, “/WEB-INF/componentDefinitions.xml”, “/WEB-INF/instanceDefinitions.xml” ;處理過程同上面一樣。 for (int i = 0; i DEFAULT_DEFINITION_; i+) = DEFAULT_DEFINITION_i; try initFactory(servletContext, ); /與上面一樣處理,只是取值不同罷了 if (log

43、.isInfoEnabled() . catch ( ex) / Do nothing 17public class I18nFactorySet extends FactorySet protected void initFactory( ServletContext servletContext, String proposed) throws DefinitionsFactoryException, / 下面語句段的意思就是講“tiles-def.xml,tiles-def-ext.xml”,通過分詞器StringTokenizer工具,以“,”作為分隔符,切分到tokenizer中,后

44、存儲在數(shù)組中,這時, tiles-def.xml,tiles-def-ext.xml StringTokenizer tokenizer = new StringTokenizer(proposed, ,); this. = new ArrayList(tokenizer.countTokens();/很重要,后面就取里面的文件,讀入數(shù)據(jù)行 while (tokenizer.hasMoreTokens() this.(tokenizer.nextToken().trim(); loaded = new HashMap(); defaultFactory = createDefaultFacto

45、ry(servletContext);/這是主要流程語句,通過上面產(chǎn)生的,處理里面每個文件,將tiles-def.xml或tiles-def-ext.xml中的definition 值對,讀入到defaultFactory,即definitionFactory if (log.isDebugEnabled() 18public class I18nFactorySet extends FactorySet protected DefinitionsFactory createDefaultFactory(ServletContext servletContext) throws Definit

46、ionsFactoryException, /下頁將這行代碼,具體解析tiles-def.xml,生成XmlDefinitionsSet , XmlDefinitionsSet rootXmlConfig = parseXmlFiles(servletContext, , null); if (rootXmlConfig = null) throw new (); /解析tiles-def.xml繼承,及遇到繼承element extends時,將父類的path參數(shù)值替換掉子類值,父類的key,對應(yīng)子類沒有value時,就用父類value進(jìn)行override,里面用的遞歸,實(shí)際上挺簡單,實(shí)現(xiàn)相

47、對好。 rootXmlConfig.resolveInheritances(); if (log.isDebugEnabled() log.debug(rootXmlConfig); /里面使用 definitions = new HashMap(); definitions.put( definition.getName(), definition ); definition就是rootXmlConfig集合中一項(xiàng)/為什么是以值對的形式組成的map 工廠,及definitionsFactory,這些就足以說明,到此,挺欣慰吧。 DefinitionsFactory factory = new

48、 DefinitionsFactory(rootXmlConfig);/ if (log.isDebugEnabled() log.debug(factory loaded : + factory); return factory;/這就是我們要的definitionsFactory, 19public class I18nFactorySet extends FactorySet /終于看到解析的代碼塊了吧,這頁特重要 protected XmlDefinitionsSet parseXmlFile( ServletContext servletContext, String , XmlDe

49、finitionsSet xmlDefinitions) throws DefinitionsFactoryException try InputStream input = servletContext.getResourceAsStream();/通過得到input if (null = input) try input = new java.io.( servletContext.getRealPath(); catch (Exception e) / If the config isnt in the servlet context, try the class loader / wh

50、ich allows the config files to be stored in a jar if (input = null) input = getClass().getResourceAsStream(); / If still nothing found, this mean no config associated if (input = null) if (log.isDebugEnabled() log.debug(Cant open file + + ); return xmlDefinitions; /上面是獲得input的幾種不同處理方式,如果input為空,就不讀入

51、數(shù)據(jù)到xmlDefinitions,即definitionFactory中 / Check if parser already exist. / Doesnt seem to work yet. if( xmlParser = null ) if (true) /下面行xmlParser在初始化過程中,要添加digester的解析規(guī)則, / Init syntax rules initDigester( digester ); xmlParser = new XmlParser();/使用digester的解析功能,前面一直談到,tiles-def.xml to definitionFacto

52、ry 采用digester工具 xmlParser.setValidating(isValidatingParser);/設(shè)置xmlParser 的驗(yàn)證參數(shù),及解析式是否驗(yàn)證 / Check if definition set already exist. if (xmlDefinitions = null) /總是definitionFactory是一個集合或map,下面這項(xiàng)就足以說明了吧 xmlDefinitions = new XmlDefinitionsSet();/ public XmlDefinitionsSet() definitions = new HashMap(); xml

53、Parser.parse(input, xmlDefinitions);/digester開始解析 catch (SAXException ex) throw new DefinitionsFactoryException() catch (IOException ex) return xmlDefinitions;/這就是tilesPlugin的重要成果,要的就是difinitionFactory,始終圍繞如何產(chǎn)生這個集合工廠在工作,實(shí)在煞費(fèi)苦心 20Tiles-def.xml代碼fragment /一個definition樣例,可以看到值對形式,里面put只是這個definition的參數(shù)

54、 . /對照下面digester解析規(guī)則看/這是digester的部分規(guī)則,他有多個規(guī)則,如initDigesterForTilesDefinitionsSyntax( digester ); initDigesterForComponentsDefinitionsSyntax( digester ); initDigesterForInstancesSyntax( digester );private void initDigesterForTilesDefinitionsSyntax( Digester digester ) String PACKAGE_NAME = org.apache

55、.struts.tiles.xmlDefinition; String DEFINITION_TAG = tiles-definitions/definition; String definitionHandlerClass = PACKAGE_NAME + .XmlDefinition; / definitionHandlerClass = org.apache.struts.tiles.xmlDefinition. XmlDefinition String PUT_TAG = DEFINITION_TAG + /put; /tiles-definitions/definition/put;

56、 String putAttributeHandlerClass = PACKAGE_NAME + “.XmlAttribute”; org.apache.struts.tiles.xmlDefinition. XmlAttribute digester.addObjectCreate( DEFINITION_TAG, definitionHandlerClass );/見到 definition 標(biāo)簽,就產(chǎn)生一個XmlDefinition類,實(shí)際上它對應(yīng)上面tiles-def.xml的一個definition樣例,只是變成類的形式,這個類最后以值對的形式存在difinitionFactory

57、的map中,備請求轉(zhuǎn)發(fā)檢索用 digester.addSetProperties( DEFINITION_TAG);/設(shè)置剛才類對象XmlDefinition的屬性, name=“portal” 和 path=“/portal/layout_portal.jsp,這樣XmlDefinition就有屬性name,和path,最后以name為key進(jìn)行檢索,得到path對應(yīng)的頁面,同時將tiles-def.xml中,例如的片段,在頁面中對變量in_frame用false進(jìn)行替換 digester.addSetNext( DEFINITION_TAG, “putDefinition”, defini

58、tionHandlerClass);/這句的意思就是講剛產(chǎn)生的XmlDefinition,實(shí)際上是以棧形式放在棧頂,將以某種方式剔除出棧頂,在系統(tǒng)中以對象形式保存在他上級對象中,以便于再碰到新的對象,重新開始此流程操作。不清楚的,可看digester資料。21TilesRequestProcessor支持tiles框架源碼實(shí)現(xiàn)這里要用到tilePlugin.init的重要成果,definitionsFactory,就是map,以形式存在public class TilesRequestProcessor extends RequestProcessor /在 requestProcesser初

59、始化時,拿到definitionsFactorypublic void init(ActionServlet servlet, ModuleConfig moduleConfig) throws ServletException super.init(servlet, moduleConfig); this.initDefinitionsMapping();/添加了這句,拿到tilePlugin.init 的結(jié)果definitionsFactory protected void initDefinitionsMapping() throws ServletException /上行流程走到這步

60、 / Retrieve and set factory for this modules definitionsFactory = ( (TilesUtilStrutsImpl) TilesUtil.getTilesUtil() .getDefinitionsFactory( getServletContext(), moduleConfig);/拿到前面產(chǎn)生的definitionsFactory ,是在TilesUtilStrutsModulesImpl中的ServletContext中的屬性DEFINITIONS_FACTORY對應(yīng)的值。大家不要擔(dān)心,前面有一個步驟沒寫,就是產(chǎn)生的Fact

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論