国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Tomcat源碼分析
Tomcat源碼分析(類加載器)
文章分類:Java編程
1.Tomcat共有五類ClassLoader:
commonLoader:
用于加載公共jar包,比如servlet規(guī)范包,servlet-api.jar,位于/common
catalinaLoader:
用于加載Tomcat的實(shí)現(xiàn)jar包,比如catalina.jar,位于/server
sharedLoader:
用于加載所有應(yīng)用的共享jar包,比如struts核心包就可以放在下面,位于/shared
webappClassLoader
用于加載web應(yīng)用下的class,一個web應(yīng)用有一個webappClassLoader
JasperLoader
用于加載web應(yīng)用下由jsp編譯后的servlet,一個web應(yīng)用有一個JasperLoader
它們的父子代理關(guān)系如下:
JREClassLoader
|
commonLoader
/                       \
catalinaLoader        sharedLoader
/                      \
webappClassLoader ........webappClassLoader
|                                         |
JasperLoader                   JasperLoader
2.WebAppClassLoader加載策略
1.首先判斷class是否已經(jīng)加載,若已加載,則直接返回,若沒加載,則進(jìn)行第2步
2.使用系統(tǒng)加載器加載class,若加載成功,則返回,若失敗,則進(jìn)行第3步
3.如果webAppClassLoader設(shè)置了代理模式,則用父加載器進(jìn)行加載;否則直接加載
4.如果webAppClassLoader未設(shè)置代理模式,則自己先加載,失敗后再使用父加載器加載
WebappClassLoader類loadClass方法
Java代碼 
public Class loadClass(String name, boolean resolve)
throws ClassNotFoundException {
if (log.isDebugEnabled())
log.debug("loadClass(" + name + ", " + resolve + ")");
Class clazz = null;
// Log access to stopped classloader
if (!started) {
try {
throw new IllegalStateException();
} catch (IllegalStateException e) {
log.info(sm.getString("webappClassLoader.stopped", name), e);
}
}
// (0) Check our previously loaded local class cache
clazz = findLoadedClass0(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug("  Returning class from cache");
if (resolve)
resolveClass(clazz);
return (clazz);
}
// (0.1) Check our previously loaded class cache
clazz = findLoadedClass(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug("  Returning class from cache");
if (resolve)
resolveClass(clazz);
return (clazz);
}
// (0.2) Try loading the class with the system class loader, to prevent
//       the webapp from overriding J2SE classes
try {
clazz = system.loadClass(name);
if (clazz != null) {
if (resolve)
resolveClass(clazz);
return (clazz);
}
} catch (ClassNotFoundException e) {
// Ignore
}
// (0.5) Permission to access this class when using a SecurityManager
if (securityManager != null) {
int i = name.lastIndexOf('.');
if (i >= 0) {
try {
securityManager.checkPackageAccess(name.substring(0,i));
} catch (SecurityException se) {
String error = "Security Violation, attempt to use " +
"Restricted Class: " + name;
log.info(error, se);
throw new ClassNotFoundException(error, se);
}
}
}
boolean delegateLoad = delegate || filter(name);
// (1) Delegate to our parent if requested
if (delegateLoad) {
if (log.isDebugEnabled())
log.debug("  Delegating to parent classloader1 " + parent);
ClassLoader loader = parent;
if (loader == null)
loader = system;
try {
clazz = loader.loadClass(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug("  Loading class from parent");
if (resolve)
resolveClass(clazz);
return (clazz);
}
} catch (ClassNotFoundException e) {
;
}
}
// (2) Search local repositories
if (log.isDebugEnabled())
log.debug("  Searching local repositories");
try {
clazz = findClass(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug("  Loading class from local repository");
if (resolve)
resolveClass(clazz);
return (clazz);
}
} catch (ClassNotFoundException e) {
;
}
// (3) Delegate to parent unconditionally
if (!delegateLoad) {
if (log.isDebugEnabled())
log.debug("  Delegating to parent classloader at end: " + parent);
ClassLoader loader = parent;
if (loader == null)
loader = system;
try {
clazz = loader.loadClass(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug("  Loading class from parent");
if (resolve)
resolveClass(clazz);
return (clazz);
}
} catch (ClassNotFoundException e) {
;
}
}
throw new ClassNotFoundException(name);
}
Tomcat源碼分析(過濾器)
文章分類:Java編程
Tomcat的過濾器主要由Filter、FilterChain組成,F(xiàn)ilterChain包含一個Filter數(shù)組.當(dāng)Wrapper執(zhí)行FilterChain的doFilter(request,response)方法時,F(xiàn)ilterChain首先調(diào)用第一個Filter的doFilter(request,response,filterchain)方法,當(dāng)?shù)谝粋€filter做完過濾操作后,它又會調(diào)用filterchain的doFilter方法,此時filterchain的當(dāng)前filter已變?yōu)榈诙€filter,第二個filter又執(zhí)行dofilter方法,依此類推,直至所有過濾器都執(zhí)行完畢
1.接口
Java代碼 
public interface Filter {
.....
//執(zhí)行過濾
public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
}
public interface FilterChain {
public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
}
2.實(shí)現(xiàn)例子
Java代碼 
class ApplicationFilterChain implements FilterChain {
//pos為當(dāng)前filter的所在位置,n為filters數(shù)組的長度
if (pos < n) {
//pos++執(zhí)行后,把filterchain的當(dāng)前filter指向下一個
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = null;
try {
filter = filterConfig.getFilter();
//filter執(zhí)行過濾操作
filter.doFilter(request, response, this);
}
...
}
}
class SampleFilter implements Filter {
........
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
//do something
.....
//request, response傳遞給下一個過濾器進(jìn)行過濾
chain.doFilter(request, response);
}
}
過濾器可以在web.xml中進(jìn)行配置
Tomcat源碼分析(閥門)
關(guān)鍵字: tomcat源碼分析
1.Tomcat組件及關(guān)系
Server
--Service
--Connector
--Engine
--Host
--Context
--Wrapper(Servlet)
Server代表Tomcat應(yīng)用服務(wù)器,它可以包含多個Service服務(wù);一個Service服務(wù)包含多個Connector和一個Engine;一個Engine可以包含多個虛擬主機(jī)Host;一個Host可以包含多個Web應(yīng)用Context,而每個Web下有可以包含多個Wrapper(Servlet的包裝器)
組件及其關(guān)系可以參考Tomcat的Server.xml及Web.xml文件
2.當(dāng)一個請求到達(dá)時,Connector會把它包裝成Request對象,同時生成Response對象;然后Connector會調(diào)用Engine的invoke方法,它又會調(diào)用Host的invoke 方法,Host的invoke方法又會調(diào)用Context的invoke方法,最后,Context的invoke方法調(diào)用Wrapper的invoke方法,至此,責(zé)任鏈調(diào)用結(jié)束。
接口及實(shí)現(xiàn):
a.Pipeline , 此接口的實(shí)現(xiàn)主要用于維護(hù)閥門及先后關(guān)系,實(shí)現(xiàn)見  org.apache.catalina.core.StandardPipleline
Java代碼 
public interface Pipeline {
//獲取最后一個閥門
public Valve getBasic();
//設(shè)置最后一個閥門
public void setBasic(Valve valve);
//添加閥門
public void addValve(Valve valve);
public Valve[] getValves();
public void removeValve(Valve valve);
//獲取第一個閥門
public Valve getFirst();
b.Valve , 閥門接口,主要用于做過濾工作
Java代碼 
public interface Valve {
public String getInfo();
//獲取下一個閥門
public Valve getNext();
//設(shè)置下一個閥門
public void setNext(Valve valve);
public void backgroundProcess();
//閥門過濾
public void invoke(Request request, Response response)
throws IOException, ServletException;
}
c.下面是與責(zé)任鏈有關(guān)的實(shí)現(xiàn)代碼,以Engine的標(biāo)準(zhǔn)實(shí)現(xiàn)StandardEngine為例
Java代碼 
StandardEngine{
public StandardEngine() {
super();
//設(shè)置StandardEngineValve為Engine的最后一個閥門
pipeline.setBasic(new StandardEngineValve());
}
//添加閥門
public synchronized void addValve(Valve valve) {
pipeline.addValve(valve);
}
//此方法被Connector調(diào)用
public void invoke(Request request, Response response)
throws IOException, ServletException {
pipeline.getFirst().invoke(request, response);
}
}
d.StandardEngine簡單閥門的實(shí)現(xiàn)
Java代碼 
SimpleValve implements Valve{
....
//閥門過濾方法
public void invoke(Request request, Response response)
throws IOException, ServletException{
//do something
//調(diào)用下一個閥門的invoke方法
getNext().invoke(Request request, Response response);
//do something
}
}
e.StandardEngine最后一個閥門(StandardEngineValve)的實(shí)現(xiàn)
Java代碼 
StandardEngineValve extends ValveBase{
...
public void invoke(Request request, Response response)
throws IOException, ServletException{
Host host = request.getHost();
//至此,StandardEngine中的閥門都已處理完畢,下面把request、
//response對象交給host處理
host.getPipeline().getFirst().invoke(request, response);
}
c,d,e代碼即為StandardEngine責(zé)任鏈調(diào)用的主要代碼,Host、Context、Wrapper的責(zé)任鏈調(diào)用相關(guān)代碼與其類似,閥門可以在Server.xml及Web.xml中配置
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
編程語言學(xué)習(xí)Tomcat(四)之Engine和Host容器
Tomcat源碼分析之 doGet方法(四)
Tomcat工作原理B
Tomcat7中一次請求處理的前世今生(四)Tomcat7閥機(jī)制原理
tomcat6中的請求流程
JFinal
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服