[深入剖析Tomcat]一個簡單的servlet容器實現2
阿新 • • 發佈:2019-02-08
本文承接上一篇文章,解釋不使用requestFacade, responseFacade為什麼不好,使用requestFacade, responseFacade為什麼可以解決問題。
- 不使用requestFacade, responseFacade為什麼不好:
public class Test {
public static void main(String[] args){
//上轉型,Response例項轉換為ServletResponse例項,
//相對應於將Response例項的引數傳給service(ServletRequest res,ServletResponse response)
ServletResponse b=new Response();
b.sayhello();
//相對應於在service(ServletRequest res,ServletResponse response)方法體中將
//ServletRequest例項的b轉換為Response例項型的,從而訪問類Response有的而ServletRequest沒有的sendStaticResource方法
//從而造成不安全
Response res=(Response) b;//把
res.sendStaticResource();
}
}
class Response implements ServletResponse{
@Override
public void sayhello() {
System.out.println("Response...");
}
public void sendStaticResource(){
System.out.println("sendStaticResource");
}
}
interface ServletResponse{
public void sayhello();
}
- 使用requestFacade, responseFacade為什麼可以解決問題
public class Test2 {
public static void main(String[] args){
//上轉型,在ResponseFacade內部把Response例項轉換為ServletResponse例項,
ResponseFacade b=new ResponseFacade(new Response()) ;
//相對應於將Response例項的引數傳給service(ServletRequest res,ServletResponse response)
ServletResponse c=b;
//1、相對應於在service(ServletRequest res,ServletResponse response)方法體中將
//2、ServletRequest例項的c轉換為ResponseFacade例項型的,再把裡面的ServletResponse例項的response取出,記做res.response
//3、將res.response轉為Response型,從而訪問sendStaticResource方法
//按照上面3步,在第二步中res.response為private,從而無法做到第2、3步,使sendStaticResource不能被訪問到
ResponseFacade res=(ResponseFacade) c;
Response res2=(Response)res.response;//報錯The field ResponseFacade.response is not visible
res2.sendStaticResource();
}
}
class ResponseFacade implements ServletResponse{
private ServletResponse response=null;
public ResponseFacade(Response response){
this.response=response;
}
@Override
public void sayhello() {
System.out.println("ResponseFacade...");
}
}