這篇文章主要為大家展示了“Tomcat配置文件的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Tomcat配置文件的示例分析”這篇文章吧。
網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)建站專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營(yíng)網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁(yè)面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都混凝土攪拌機(jī)等企業(yè)提供專業(yè)服務(wù)。
Tomcat用戶一定都知道其包含一個(gè)名為server.xml的配置文件。畢竟都在這里改過(guò)端口或者以目錄形式部署過(guò)應(yīng)用。
那這個(gè)配置文件里的配置信息又是如何對(duì)應(yīng)到Tomcat中的具體對(duì)象的。開發(fā)的朋友馬上會(huì)在大腦里浮現(xiàn)出Dom4j、Jdom、JAXB、SAX...一系列的XML解析工具。
不過(guò),這里Tomcat用的并不是上面提到的這幾位,而是Apache社區(qū)自己的XML解析工具Digester.
在Digester的Wiki里,這樣介紹自己:
Many projects read XML configuration files to provide initialization of various Java objects within the system. There are several ways of doing this, and the Digester component was designed to provide a common implementation that can be used in many different projects.
我們來(lái)看Tomcat內(nèi)部對(duì)于Digester是如何使用的。
在Catalina類內(nèi),我們會(huì)發(fā)現(xiàn)許多類似這樣的代碼:
digester.addObjectCreate("Server/Service",
"org.apache.catalina.core.StandardService",
"className");
digester.addSetProperties("Server/Service");
digester.addSetNext("Server/Service",
"addService",
"org.apache.catalina.Service");digester.addRuleSet(new NamingRuleSet("Server/GlobalNamingResources/"));
digester.addRuleSet(new EngineRuleSet("Server/Service/"));
digester.addRule("Server/Service/Connector",
new ConnectorCreateRule());
以上這些是配置,最終的解析是通過(guò)parse這樣一個(gè)方法
inputSource.setByteStream(inputStream);
digester.push(this);
digester.parse(inputSource);
那是不是整個(gè)parse就是解析配置文件是否非法呢? Of course Not.
對(duì)應(yīng)上面標(biāo)紅的addObjectCreate, addSetProperties,這些操作的背后,其實(shí)是添加了一系列的Rule。
這是個(gè)抽象類,對(duì)于上面添加的不同的Rule,有不同的實(shí)現(xiàn)。
其中,create對(duì)應(yīng)的實(shí)現(xiàn)是ObjectCreateRule
public void addObjectCreate(String pattern, String className,
String attributeName) {
addRule(pattern,
new ObjectCreateRule(className, attributeName));
}
setProperties對(duì)應(yīng)的是SetPropertiesRule。
public void addSetProperties(String pattern) {
addRule(pattern,
new SetPropertiesRule());
}
setNext對(duì)應(yīng)的Rule是SetNextRule
在解析過(guò)程中,SetNextRule實(shí)質(zhì)上,是會(huì)通過(guò)反射,調(diào)用對(duì)應(yīng)方法。下圖是在執(zhí)行Catalina的一個(gè)setServer的Rule
對(duì)應(yīng)setProperties的執(zhí)行,也是通過(guò)反射,設(shè)置對(duì)應(yīng)屬性的值。例如,下圖是在設(shè)置Server的port屬性值。
這時(shí),你可能會(huì)問(wèn),那這些對(duì)象設(shè)置屬性,創(chuàng)建新對(duì)象等,他們之間又是如何關(guān)聯(lián)起來(lái)的呢?
看這里,在Digester內(nèi)部維護(hù)了一個(gè)stack結(jié)構(gòu),從下到上,越向上的層級(jí)越高。如下圖,從Catalina,向上到Server,再到Service
進(jìn)行Set的時(shí)候,會(huì)從頂向下,兩個(gè)相鄰的,即為父子關(guān)系,從而進(jìn)行parent的child設(shè)置。
public void end(String namespace, String name) throws Exception {
// Identify the objects to be used
Object child = digester.peek(0);
Object parent = digester.peek(1);
// Call the specified method
IntrospectionUtils.callMethod1(parent, methodName,
child, paramType, digester.getClassLoader());
}
而對(duì)應(yīng)的屬性設(shè)置的時(shí)候,則是從stack里取最上面的一個(gè),反射進(jìn)行屬性設(shè)置。
整個(gè)stack的最底層,則是Catalina,在獲取配置文件輸入流之后進(jìn)行的push操作
public void push(Object object) {
if (stack.size() == 0) {
root = object;
}
stack.push(object);
}
Digester整體的設(shè)計(jì)思路,在XML元素開始,創(chuàng)建Object的rule執(zhí)行時(shí),把新創(chuàng)建的對(duì)象push到stack中。對(duì)象會(huì)保留在stack中,直到XML元素的結(jié)尾出現(xiàn)。
Rule的解析過(guò)程主要涉及到上面Rule類的幾個(gè)方法
begin 元素開始時(shí)會(huì)執(zhí)行
body 嵌套的元素匹配時(shí)執(zhí)行
end 元素結(jié)束執(zhí)行
finish 整個(gè)parse結(jié)束時(shí)調(diào)用
在parse結(jié)束之后,整個(gè)xml內(nèi)容對(duì)應(yīng)的Java對(duì)象已經(jīng)創(chuàng)建成功,開動(dòng)吧!
在Tomcat內(nèi)部,Digester用在解析server.xml配置文件,MBean的描述文件,TLD文件校驗(yàn)等等。
具體用法也比較簡(jiǎn)單,new 一個(gè)Digester對(duì)象,然后設(shè)置具體的對(duì)象Rule,類似于各類的match規(guī)則,之后parse即可。
比如下面這個(gè)xml文件
<?xml version="1.0" encoding="UTF-8"?>
<foo name="The Parent">
<bar id="123" title="The First Child"/>
<bar id="456" title="The Second Child"/>
</foo>
解析的Digester代碼只有這些
Digester digester = new Digester();
digester.setValidating( false );
digester.addObjectCreate( "foo", "mypackage.Foo" );
digester.addSetProperties( "foo" );
digester.addObjectCreate( "foo/bar", "mypackage.Bar" );
digester.addSetProperties( "foo/bar" );
digester.addSetNext( "foo/bar", "addBar", "mypackage.Bar" );
InputStream is = digester.getClass().getClassLoader().getResourceAsStream("mytest.xml");
Foo foo = digester.parse(is);
當(dāng)然,具體XML文件需要對(duì)應(yīng)的Java類還是需要的。
以上是“Tomcat配置文件的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章標(biāo)題:Tomcat配置文件的示例分析
當(dāng)前地址:http://www.chinadenli.net/article28/igphcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、商城網(wǎng)站、品牌網(wǎng)站建設(shè)、云服務(wù)器、、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)