听说你JavaWeb学的不好?(十一)

55 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

GenericServlet

  • 我们编写一个Servlet类直接实现Servlet接口有什么缺点?

    • 我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。
  • 适配器设计模式Adapter

    • 手机直接插到220V的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个适配器。手机连接适配器。适配器连接220V的电压。这样问题就解决了。
  • 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service。

    • GenericServlet实现Servlet接口。
    • GenericServlet是一个适配器。
    • 以后编写的所有Servlet类继承GenericServlet,重写service方法即可。
  • 思考:GenericServlet类是否需要改造一下?怎么改造?更利于子类程序的编写?

    • 思考第一个问题:我提供了一个GenericServlet之后,init方法还会执行吗?

      • 还会执行。会执行GenericServlet类中的init方法。
    • 思考第二个问题:init方法是谁调用的?

      • Tomcat服务器调用的。
    • 思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?

      • 都是Tomcat干的。
      • Tomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象传给了init方法。
    • 改造:

    -   //1.添加私有属性
private ServletConfig config = null;

//2.在init方法中添加
this.config = config;

//3.在getServletConfig方法中
return config;

//通过这个改造,子类就可以通过 getServletConfig 在 service中获得  ServletConfig对象了

//4.为了避免继承了 GenericServlet 的子类重写 init 方法而导致 父类的init方法不执行而使得 getServletConfig获取到的 config = null  应该限制限制init不能重写
//init方法 添加关键字 final

//5.但是如果子类就是要重写该方法怎么办呢?
//添加一个 init方法
public void init() {}
//然后在 final 修饰的init方法里调用该方法
this.init();
//像这样子类就可以重写我们添加的init方法了

//这是一种怎么样的操作?
//这种操作,可以使得:某一个方法中如果有一些操作不想因在子类中重写该方法而失效,而有一些操作又希望可以在子类中有所不同,那么就可以这样做。如上面的:即可以保证能够给config赋值,又可以使得子类可以重写我们写的init方法来给init方法添加一些其它的操作

GenericServlet 其实Servlet规范中提供了,我们直接用就行了