日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

适配器(GenericServlet)改造Servlet

發布時間:2023/11/28 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适配器(GenericServlet)改造Servlet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JavaWeb系列教程
JavaWeb—Servlet
模擬Servlet本質
使用IDEA開發Servlet程序
Servlet對象的生命周期
適配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
HttpServlet源碼分析
web站點歡迎頁
一篇學會HttpServletRequest
如果大家覺得有幫助的話,不妨動動小手,點贊收藏一波,也方便后面的復習哈

我們發現在編寫一個Servlet類的時候,要實現它的所有方法,但是事實上,我們一般只是使用service方法,這樣就會讓代碼看著很丑陋,那么我們要怎么解決呢?
我們在說解決問題之前,先來看看這樣的一個例子

適配器設計模式Adapter

  • 手機直接插到220V的電壓上,手機直接就報廢了。怎么辦?可以找一個充電器。這個充電器就是一個適配器。手機連接適配器。適配器連接220V的電壓。這樣問題就解決了。
    同樣的道理,我們也可以使用這樣的思想,來解決這個問題
  • 編寫一個GenericServlet類,這個類是一個抽象類,其中有一個抽象方法service。

    GenericServlet實現Servlet接口。
    GenericServlet是一個適配器。
    以后編寫的所有Servlet類繼承GenericServlet,重寫service方法即可。

package com.bjpowernode.servlet;import jakarta.servlet.*;import java.io.IOException;
import java.io.PrintWriter;/*** @author zengyihong* @create 2022--03--06 20:08*/
public class AServlet extends GenericServlet {@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();//獲取ServletContext對象ServletConfig config = this.getServletConfig();ServletContext context = config.getServletContext();out.print(context);}
}

思考:GenericServlet類是否需要改造一下?怎么改造?更利于子類程序的編寫?

  • 思考第一個問題:我們提供了一個GenericServlet之后,init方法還會執行嗎?

    • 還會執行。會執行GenericServlet類中的init方法。
    • 很明顯,子類中如果這個方法,它就會去父類找相應的方法
  • 思考第二個問題:init方法是誰調用的?

    • Tomcat服務器調用的。
  • 思考第三個問題:init方法中的ServletConfig對象是誰創建的?是誰傳過來的?

    • 都是Tomcat干的。
    • Tomcat服務器先創建了ServletConfig對象,然后調用init方法,將ServletConfig對象傳給了init方法。
    • 如果對上面幾個問題不大理解的話,大家可以先去看看servlet的生命周期
  • 思考一下Tomcat服務器偽代碼:

public class Tomcat {public static void main(String[] args){// .....// Tomcat服務器偽代碼// 創建LoginServlet對象(通過反射機制,調用無參數構造方法來實例化LoginServlet對象)Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");Object obj = clazz.newInstance();// 向下轉型Servlet servlet = (Servlet)obj;// 創建ServletConfig對象// Tomcat服務器負責將ServletConfig對象實例化出來。// 多態(Tomcat服務器完全實現了Servlet規范)ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();// 調用Servlet的init方法servlet.init(servletConfig);// 調用Servlet的service方法// ....}
}

但是ServletConfig對象以后肯定是要在service方法中使用的,那么怎么才可以保證ServletConfig對象在service方法中能夠使用呢? 我們很容易就想到了成員變量

init方法中的ServletConfig對是Tomcat服務器創建好的

  • 這個ServletConfig對象目前在init方法的參數上,屬于局部變量
  • 那么怎么才能使用呢?------成員變量
  • ServletConfig對象將來肯定是要用在service方法的,怎么保證ServletConfig對象在service方法中調用呢-----調用getServletConfig()方法

思考一下,還有一種可能,需要子類重寫父類的init方法,但是這樣就會導致父類的init方法不執行,那么ServletConfig對象就是null了,那么將來就會有很大的麻煩,我們就不要讓這個方法被子類重寫,可以在方法加上final修飾,但是如果子類就是想要重寫呢? 但是這個時候子類沒有辦法重寫,那到底要怎么辦呢
解決辦法:再GenericServlet類中添加一個無參的init方法,供子類進行重寫。

上面那個過程都是我們自己一步一步根據需求推出來的,是不是感覺好麻煩,一會這樣,一會那樣的,不過好消息是,GenericServlet這個類不需要我們寫,官方已經提供好了,而且官方寫的代碼考慮的肯定比我們周全

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package jakarta.servlet;import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {private static final long serialVersionUID = 1L;private transient ServletConfig config;public GenericServlet() {}public void destroy() {}public String getInitParameter(String name) {return this.getServletConfig().getInitParameter(name);}public Enumeration<String> getInitParameterNames() {return this.getServletConfig().getInitParameterNames();}public ServletConfig getServletConfig() {return this.config;}public ServletContext getServletContext() {return this.getServletConfig().getServletContext();}public String getServletInfo() {return "";}public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}public void init() throws ServletException {}public void log(String message) {this.getServletContext().log(this.getServletName() + ": " + message);}public void log(String message, Throwable t) {this.getServletContext().log(this.getServletName() + ": " + message, t);}public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;public String getServletName() {return this.config.getServletName();}
}

大家看到我們所寫和官網提供的思路其實是大同小異的。

希望得到大家的支持

總結

以上是生活随笔為你收集整理的适配器(GenericServlet)改造Servlet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。