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...