tomcat study 第十一章

2021-07-10 21:25:41 字數 4230 閱讀 2945

1.loadservlet方法:

if如果屬性instance不為null則返回

else:

載入classclass = classloader.loadclass(actualclass);

例項化servlet = (servlet) classclass.newinstance();

呼叫init方法servlet.init(facade);

當if ((loadonstartup > 0) && (jspfile != null))

(其中監聽事件觸發這裡省略[有呼叫service方法servlet.service(req, res);])

返回return servlet;

2.allocate方法:

根據singlethreadmodel值判斷走不同分支:一不是stm子類,一是stm子類

instance = loadservlet();

instancepool.push(loadservlet());

(servlet) instancepool.pop();

stm子類執行:(stm的思想作用)

synchronized (instancepool)

//阻塞 當deallocate執行時

//maxinstances=2

//countallocated=1

//ninstances=2

//while條件不成立向下走:countallocated(++)=2

//再次阻塞可以說會一直阻塞;當執行unload時會等待(countallocated是否為0)剩餘執行完畢(此時countallocated=0);

//最後wrapervalue.invole結束

//ninstances當前stm 例項的個數

while (countallocated >= ninstances) catch (servletexception e) catch (throwable e)

} else catch (interruptedexception e) }}

if (debug >= 2)

log(" returning allocated stm instance");

countallocated++;

return (servlet) instancepool.pop();

bug(或疑問):如上的「//當第三連線進來」只要ninstances的值達到maxinstances時說明本次invole只能等待結束,instancepool中的sevlet不能被繼續使用。因為ninstances只有遞增。只有結束才變為0(ninstances=0)

3.deallocate(servlet)方法:

主要instancepool.push(servlet)方法,進行**;(適用stm子類)

4.unload();方法:

thread.currentthread().setcontextclassloader(classloader);

instance.destroy();

instance = null;

//如果是stm且instancepool池不為null

if (singlethreadmodel && (instancepool != null))

答案:當執行unload時會等待(countallocated是否為0)剩餘執行完畢(此時countallocated=0);

invoke方法:

filterchain.dofilter(sreq, sres);

過濾器:

呼叫filterchain.dofilter(sreq, sres);

createfilterchain:

filtermap filtermaps = context.findfiltermaps();

if (!matchfiltersurl(filtermaps[i], requestpath))

continue;

if (!matchfiltersservlet(filtermaps[i], servletname))

continue;

context.findfilterconfig(filtermaps[i].getfiltername());

filterchain.addfilter(filterconfig);

dofilter,internaldofilter:

filter = filterconfig.getfilter();通過filterdef的描述生成new filter

執行filter的dofilter方法

filter.dofilter(request, response, this);

最後執行servlet.service(request, response);

httponlyfilter 實現filter介面 。filterdef一一對應的是web.xml中realm(138)

loginconfig和下面一一對應

• • form

• • /login/a.html

• /login/error.html

authenticatorbase 繼承valvebase

******realm中快取arraylist users資料

******contextconfig***(context的***)載入閥門basicauthenticator

在basicauthenticator.invoke()中呼叫authenticate(hrequest, hresponse, config)

通過context.getrealm().authenticate(username, password) 進行獲取principal.如果存在進行register快取失敗根據loginconfig中設定的資料進行處理

securityconstraint.addauthrole("manager")加入授權角色, authconstraint的標誌就變為true

bootstrap1的main()中在realm realm = new ******realm(); context.setrealm(realm);

在******realm已經建立了資料並快取在arraylist users 屬性中

private void createuserdatabase()

1.先在快取中查詢。

2.在basicauthenticator.invoke()中checkuserdata方法

if ((constraint == null) /* &&//如果為null進入下乙個閥門

(!constants.form_method.equals(config.getauthmethod())) */ )

在basicauthenticator.invoke()中

if (!checkuserdata(hrequest, hresponse, constraint))

在checkuserdata方法中進行userdataconstraint驗證如果ok返回true 否則sendredirect重定向

3.在basicauthenticator.invoke()中呼叫authenticate(hrequest, hresponse, config)方法

bootstrap1的main()中constraint.addauthrole("manager");

if (constraint.getauthconstraint())

}在authenticate(hrequest, hresponse, config)方法中通過context.getrealm().authenticate(username, password) 進行獲取principal.如果存在進行register快取失敗根據loginconfig中設定的資料進行處理

4.在basicauthenticator.invoke()中accesscontrol方法

accesscontrol(hrequest, hresponse, constraint)

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...

第十一章3

第十一章 一 滾動元件 awt中的滾動元件包括scrollbar 滾動條 和滾動面板 scrollpane 兩種。1 滾動條scrollbar 在指定的取值範圍內快速選取某一值的功能。i.構造方法 public scrollbar int orientation,int value,int visi...

java第十一章

問題 1 錯誤 2 異常,1 編譯時異常 檢查異常 2 執行時異常 不檢查異常 是否能用 解決,是的就是異常,不是的就是錯誤 問題 1 先驗 2 捕獲 異常捕獲機智 異常的三個種類 1 檢查異常 2 執行時異常 3 錯誤 throw 提示方法呼叫者本方法可能發生異常 throw跟異常物件 throw...