适配器模式改造Servlet(GenericServlet)
GenericServlet
- 我们编写一个Servlet类直接实现Servlet接口有什么缺点?
o我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。
- 适配器设计模式Adapter
o手机直接插到220V的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充 o电器就是一个适配器。手机连接适配器。适配器连接220V的电压。这样问题就解决了。
- 之前的一篇博客写到抽象类的作用:降低接口实现类与接口之间的实现难度。
o (实现类不一定需要用到接口中定义的所有方法,可以先创建一个抽象类先实现一部分方 法,留下实现类需要的方法,实现类再继承抽象类,实现需要的方法。)
- 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service。
oGenericServlet实现Servlet接口。
oGenericServlet是一个适配器。
o以后编写的所有Servlet类继承GenericServlet,重写service方法即可。
思考:GenericServlet类是否需要改造一下?怎么改造?更利于子类程序的编写?
- 思考第一个问题:我提供了一个GenericServlet之后,init方法还会执行吗?
o还会执行。会执行GenericServlet类中的init方法。
- 思考第二个问题:init方法是谁调用的?
oTomcat服务器调用的。
- 思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?
o都是Tomcat干的。
oTomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象 传给了init方法。
- 思考一下Tomcat服务器伪代码:
再思考一下:
- init方法中的ServletConfig对象是Tomcat小猫咪创建好的。
- 这个ServletConfig对象目前在inti方法的参数上,属于局部变量。
- 那么ServletConfig对象以后肯定要在service方法中使用,怎么才能保证ServletConfig对象在service方法中能够使用呢?
o直接看代码:
再思考一下:
- 如果继承GenericServlet的类,想要重写init方法呢?
o给init方法加上final,这样子类就无法重写init方法了。
- 但是如果子类就是要重写init方法呢?
o解决办法:再GenericServlet类中添加一个无参的init方法,供子类进行重写。
- 最终GenericServlet类的代码;
- 值得庆幸的是:GenericServlet不需要我们程序员写,官方替我们写好了。
- 可以看到官方写的GenericServlet跟我们自己写的差不多,实现的思想是一样的。