1. 程式人生 > >[深入剖析Tomcat]一個簡單的servlet容器實現2

[深入剖析Tomcat]一個簡單的servlet容器實現2

本文承接上一篇文章,解釋不使用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...");
    }
}