GenericServlet类的实现接口中包括了ServletConfig接口,但是它自身的init(ServletConfig config)方法又需要外界给它传递一个实现ServletConfig的对象,就是说GenericServlet和ServletConfig的依赖关系既是继承关系,也是一种关联关系。
问:GenericServlet类中为什么要实现ServletConfig接口?如果没有实现这个接口,它依然能实现自己的功能,感觉他俩的关系好乱啊
求解

解决方案 »

  1.   

    就是为了方便。为了不要每次都super.init(config)
    另外,getInitParameter之类的方法都能直接工作,而不依赖于子类的init(ServletConfig)的实现方式。
      

  2.   

    谢谢你的回复,但是,感觉没有回答我的问题,也许是我的理解不对。init() A convenience method which can be overridden so that there's no need to call super.init(config).
    GenericServlet类中的init()方法是为了方便的,如果覆盖了init(ServletConfig config) 方法,还是应该调用super.init(conifg)方法的。GenericServlet实现ServletConfig接口,只是为了必须实现ServletConfig中的那几个方法?如果不实现ServletConfig接口,但在GenericServlet类中依然声明那几个方法,不是一样可以吗。
      

  3.   

    谢谢你的回复,但是,感觉没有回答我的问题,也许是我的理解不对。init() A convenience method which can be overridden so that there's no need to call super.init(config).
    GenericServlet类中的init()方法是为了方便的,如果覆盖了init(ServletConfig config) 方法,还是应该调用super.init(conifg)方法的。GenericServlet实现ServletConfig接口,只是为了必须实现ServletConfig中的那几个方法?如果不实现ServletConfig接口,但在GenericServlet类中依然声明那几个方法,不是一样可以吗。是可以用,但是,有了这个通用的初始化方法,很多需要实现Servlet接口的class就不必每次都写一模一样的代码了。这个和java.util.ArrayList继承的java.util.AbstractList / AbstractCollection存在的道理其实差不多。没有这样的层次,代码一样能工作,只不过,你没实现一次,需要重复一些相同的代码而已
      

  4.   

    继承GenericServlet后,如果你不需要在初始化的时候,玩什么花样,那么只要覆盖init方法即可。不必每实现一次,都要手工保存servletConfig。同时getInitParameter()你也不必再写一遍了。当然,这样的设计(又是Servlet,又是ServletConfig)不能说好,更谈不上必须这样。当初推出的时候,就已经这样,十多年了,所以,你只能习惯,不必再在这个上面纠结太多。给你举另外个例子,就是java.util.Stack,继承Vector,也就是说是个即是栈,又是List,而后者的存在,显然会破坏栈的LIFO原则。但是他还是在那里,完全是为了兼容之前的大家已经使用了的代码。而后续推出的Deque避免了这样的坏设计。回到GenericServlet这里,它这个设计谈不上好,但也谈不上坏。而且,由于它的子类,几乎是整个Java世界最重要的类之一,所以,接口是打死也不可能变了。
      

  5.   


    谢谢。
    感觉这样的设计实在有点奇怪,GenericServlet实现ServletConfig接口,是不是多此一举。
    不过仔细想想,貌似又有点道理,因为GenericServlet也要返回initParameter,servletContext等信息,起到了跟ServletConfig一样的作用,所以也可以迁就着看成GenericServlet is a ServletConfig吧。
    谢谢你的回复,分不多,给你吧
      

  6.   

    每个servlet对象都实现了Servlet接口和ServletConfig接口
    ServletConfig接口允许Servlet接收web应用配置中的配置参数 还向Servlet中传入一个描述Servlet允许环境的类(ServletContext)