天天看點

《Servlet和JSP學習指南》一1.8 GenericServlet

前面的例子展示了如何通過實作servlet接口來編寫servlet。但你是否注意到,必須為servlet中的所有方法都提供實作,即使它們中有些不含代碼的方法也是一樣?此外,還需要将servletconfig對象儲存在一個類級變量中。

值得慶幸的是,我們有了genericservlet抽象類。它本着在面向對象程式設計中易于編寫代碼的精神,實作了servlet和servletconfig,并完成以下工作:

将init方法中的servletconfig賦給一個類級變量,使它可以通過調用getservletconfig來擷取。

為servlet接口中的所有方法提供預設實作。

提供方法來包裝servletconfig中的方法。

genericservlet通過在init方法中将servletconfig對象賦給一個類級變量servlet-config,實作對servletconfig的儲存。下面就是init方法在genericservlet中的實作。

《Servlet和JSP學習指南》一1.8 GenericServlet

但是,如果在類中覆寫了這個方法,則調用servlet中的init方法,并且必須調用super.init(servletconfig)來儲存servletconfig。為了避免這麼做,genericservlet又另外提供了一個init方法,它不帶參數。當把servletconfig賦給servletconfig之後,這個方法就會被第一個init方法調用:

《Servlet和JSP學習指南》一1.8 GenericServlet

這意味着,可以通過覆寫無參的init方法來編寫初始化代碼,servletconfig仍然由genericservlet執行個體儲存。

代碼清單1-3中的genericservletdemoservlet類是對代碼清單1-2中servletconfig-demoservlet的改寫。注意,這個新的servlet繼承了genericservlet類,而不是實作servlet接口。

《Servlet和JSP學習指南》一1.8 GenericServlet

可以看出,通過繼承genericservlet,就不需要覆寫你沒計劃要修改的那些方法了。這樣,代碼就會變得更加清晰。在代碼清單1-3中,唯一被覆寫的方法是service方法,而且,不必親自儲存servletconfig。

利用下面這個url調用servlet,其結果應該與servletconfigdemoservlet的一樣。

《Servlet和JSP學習指南》一1.8 GenericServlet

雖然genericservlet是servlet的增強版本,但前者畢竟不常用,因為它不如httpservlet進階。在現實的應用程式中,真正使用的還是httpservlet。詳情檢視下一節的内容。