• tomcat外观模式的意义(安全)


    《How Tomcat works》,中文版结合看。


    第一章是简单的web服务器实现,简单HTTP请求后进行返回,这个需要了解HTTP的请求和响应的组成。然后会使用Socket和ServerSocket就可以模拟简单的实现。大概的思路就是HTTP请求后,解析后返回响应,浏览器根据响应的格式返回特定的信息。

    第二章是简单的Servlet容器实现,对暂时处理静态资源请求。现在增加对Servlet的请求处理。静态资源的话就是直接读取文件后返回。而Servlet的请求处理其实也没有想象那么神奇,其实就是类加载器加载之后调用对应的方法。然后响应结果。

    中文在这里翻译有错误,ServletProcessor1中,Request实现ServletRequest接口,Response实现ServletResponse接口。
    所以Request和Response实例转ServletRequest,ServletResponse都是向上转型。翻译是一上一下。


    ServletProcessor1核心代码:

    URLClassLoader loader = new URLClassLoader(urls);
    Class myClass = loader.loadClass(servletName);
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) request,(ServletResponse) response);


    ServletProcessor2核心代码:
    URLClassLoader loader = new URLClassLoader(urls);
    Class myClass = loader.loadClass(servletName);
    RequestFacade requestFacade = new RequestFacade(request);
    ResponseFacade responseFacade = new ResponseFacade(response);
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade);


    Request核心代码
    public class Request implements ServletRequest {
    /* implementation of the ServletRequest*/
    public Object dosth() {
    dosth;
    }


    public Object myownmethod(){


    }
    }


    RequestFacade核心代码
    public class RequestFacade implements ServletRequest {


    private ServletRequest request = null;


    public RequestFacade(Request request) {
    this.request = request;
    }


    /* implementation of the ServletRequest*/
    public Object dosth() {
    return request.dosth();
    }
    }


    ServletProcessor2的代码要比ServletProcessor1好在哪里呢?


    其实自己直接写个例子程序更简单

    public interface Father {
    public void say();
    }


    public class Son implements Father{
    public void say(){
    System.out.println("son");
    }
    public void sonmethod(){
    System.out.println("father no");
    }
    }


    public class SonDecade implements Father{
    private Son son = null;
    public SonDecade(Son son){
    this.son = son;
    }
    public void say(){
    son.say();
    }
    }


    public class Test {
    public static void main(String[] args) {
    Son son = new Son();
    Test.get((Father)son);
    SonDecade sd = new SonDecade(son);
    Test.get((Father)sd);
    }

    public static void get(Father f){
    Son s = (Son)f;
    //如果强制向下转型 Father为Son,那么可以调用到son的公共方法,这是不安全的, 又不能将public方法设为private
    //因为其他类需要用到
    s.sonmethod();
    //所以使用外观模式,虽然也可以向下转型,但是转SonDecade,只能调用SonDecade的方法.而其中并没有sonmethod方法。
    SonDecade sd = (SonDecade)f;
    }
    }

    同理,ServletProcessor1中,如果知道内部代码实现的程序员

    servlet.service((ServletRequest) request,(ServletResponse) response);

    可以将ServletRequest实例再向下转型为Request后调用其公共方法。就跟调用Son的sonmethod一样,但是你的方法是给其他类使用的而不是给人这样向下转型后调用的话,可以使用外观模式将其去掉,其实跟一层皮一样,遮掩了一些方法,里面还是不变的。
    ————————————————
    版权声明:本文为CSDN博主「iaiti」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/iaiti/article/details/51777664

  • 相关阅读:
    eureka_feign学习_1
    九度 题目1183:守形数----------------我用的方法自创
    题目1179:阶乘-------------阶乘不用long long int 就不能AC
    题目1177:查找---------------字符串的函数问题
    题目1170:找最小数-------------------------------找最小值,中间值应该初始化为最大值
    题目1169:比较奇偶数个数-----------------------------这个世界不是奇数就是偶数l
    题目1075:斐波那契数列
    题目1070:今年的第几天?---------关键是闰年的判断
    题目1068:球的半径和体积----------------------------arccos(-1)要用c语言中的acos(-1)代替
    题目1067:n的阶乘--------long long int
  • 原文地址:https://www.cnblogs.com/CreatorKou/p/11957675.html
Copyright © 2020-2023  润新知