天天看點

卷妹的成長日記之javaweb day2

卷妹的成長日記之javaweb day2

👩‍💻部落格首頁:京與舊鋪的部落格首頁

✨歡迎關注🖱點贊🎀收藏⭐留言✒

🔮本文由京與舊鋪原創

😘系列專欄:java學習

👕參考網站:動力節點

💻首發時間:🎞2022年7月30日🎠

🎨你做三四月的事,八九月就會有答案,一起加油吧

🀄如果覺得部落客的文章還不錯的話,請三連支援一下部落客哦

🎧最後的話,作者是一個新人,在很多方面還做的不好,歡迎大佬指正,一起學習哦,沖沖沖

💬推薦一款模拟面試、刷題神器👉​​點選進入網站​​

🛒導航小助手🎪

文章目錄

  • ​​卷妹的成長日記之javaweb day2​​
  • ​​🛒導航小助手🎪​​
  • ​​@[toc]​​
  • ​​👀09p 使用idea工具開發servlet​​
  • ​​解決Tomcat伺服器在DOS指令視窗中的亂碼問題(控制台亂碼)​​
  • ​​向浏覽器響應一段HTML代碼​​
  • ​​在Servlet中連接配接資料庫,怎麼做?​​
  • ​​在內建開發環境中當中開發程式​​
  • ​​🤣10p servlet對象的生命周期​​
  • ​​🐱‍🐉11p 擴充卡模式改造servlet​​

👀09p 使用idea工具開發servlet

解決Tomcat伺服器在DOS指令視窗中的亂碼問題(控制台亂碼)

将CATALINA_HOME/conf/logging.properties檔案中的内容修改如下:

java.util.logging.ConsoleHandler.encoding = GBK

向浏覽器響應一段HTML代碼

public void service(ServletRequest request, ServletResponse response){
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.print("<h1>hello servlet!</h1>");
}      

在Servlet中連接配接資料庫,怎麼做?

  • Servlet是Java程式,是以在Servlet中完全可以編寫JDBC代碼連接配接資料庫。
  • 在一個webapp中去連接配接資料庫,需要将驅動jar包放到WEB-INF/lib目錄下。(com.mysql.cj.jdbc.Driver 這個類就在驅動jar包當中。)

在內建開發環境中當中開發程式

目前使用較多的內建開發環境

idea居多,idea在提示功能方面強于eclipse,是以使用起來更智能

eclipse處于減少的趨勢,是idm團隊開發的,寓意是日食

使用IDEA內建開發工具開發Servlet

  • 第一步:New Project(我比較習慣先建立一個Empty Project【空工程】,然後在空工程下建立Module【子產品】,這不是必須的,隻是一種習慣,你可以直接建立非空的Project),這個Empty Project起名為:javaweb(不是必須的,隻是一個名字而已。一般情況下建立的Project的名字最好和目錄的名字一緻。)
  • 第二步:建立子產品(File --> new --> Module…)
  • 這裡建立的是一個普通的JavaSE子產品(這裡先不要建立Java Enterprise子產品)
  • 這個Module自動會被放在javaweb的project下面。
  • 這個Module起名:servlet01
  • 第三步:讓Module變成JavaEE的子產品。(讓Module變成webapp的子產品。符合webapp規範。符合Servlet規範的Module)
  • 在Module上點選右鍵:Add Framework Support…(添加架構支援)
  • 在彈出的視窗中,選擇Web Application(選擇的是webapp的支援)
  • 選擇了這個webapp的支援之後,IDEA會自動給你生成一個符合Servlet規範的webpp目錄結構。
  • 重點,需要注意的:在IDEA工具中根據Web Application模闆生成的目錄中有一個web目錄,這個目錄就代表webapp的根
  • 第四步(非必須):根據Web Application生成的資源中有index.jsp檔案,這裡我選擇删除這個index.jsp檔案。
  • 第五步:編寫Servlet(StudentServlet)
  • class StudentServlet implements Servlet
  • 這個時候發現Servlet.class檔案沒有。怎麼辦?将CATALINA_HOME/lib/servlet-api.jar和jsp-api.jar添加到classpath當中(這裡的classpath說的是IDEA的classpath)
  • File --> Project Structrue --> Modules --> + 加号 --> Add JARS…
  • 實作jakarta.servlet.Servlet接口中的5個方法。
  • 第六步:在Servlet當中的service方法中編寫業務代碼(我們這裡連接配接資料庫了。)
  • 第七步:在WEB-INF目錄下建立了一個子目錄:lib(這個目錄名可不能随意,必須是全部小寫的lib),并且将連接配接資料庫的驅動jar包放到lib目錄下。
  • 第八步:在web.xml檔案中完成StudentServlet類的注冊。(請求路徑和Servlet之間對應起來)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>studentServlet</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.StudentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>studentServlet</servlet-name>
        <url-pattern>/servlet/student</url-pattern>
    </servlet-mapping>
    
</web-app>      
  • 第九步:給一個html頁面,在HTML頁面中編寫一個超連結,使用者點選這個超連結,發送請求,Tomcat執行背景的StudentServlet。
  • student.html
  • 這個檔案不能放到WEB-INF目錄裡面,隻能放到WEB-INF目錄外面。
  • student.html檔案的内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>student page</title>
</head>
<body>
    <!--這裡的項目名是 /xmm ,無法動态擷取,先寫死-->
    <a href="/xmm/servlet/student">student list</a>
</body>
</html>      
  • 第十步:讓IDEA工具去關聯Tomcat伺服器。關聯的過程當中将webapp部署到Tomcat伺服器當中。
  • IDEA工具右上角,綠色小錘子右邊有一個:Add Configuration
  • 左上角加号,點選Tomcat Server --> local
  • 在彈出的界面中設定伺服器Server的參數(基本上不用動)
  • 在目前視窗中有一個Deployment(點選這個用來部署webapp),繼續點選加号,部署即可。
  • 修改 Application context為:/xmm
  • 第十一步:啟動Tomcat伺服器
  • 在右上角有綠色的箭頭,或者綠色的小蟲子,點選這個綠色的小蟲子,可以采用debug的模式啟動Tomcat伺服器。
  • 我們開發中建議适用debug模式啟動Tomcat
  • 第十二步:打開浏覽器,在浏覽器位址欄上輸入:http://localhost:8080/xmm/student.html

🤣10p servlet對象的生命周期

servlet對象是由誰來維護的,對象的建立,對象上方法的調用,對象最終的銷毀,javaweb程式員是無權幹預的

servlet生命周期是由tomcat伺服器全權負責的

tomcat伺服器我們又稱為web容器

web容器來管理servlet對象的生命

思考:我們自己new的servlet對象受web容器的管理嗎

我們自己new的servlet對象是不受web容器管理的

web容器建立的servlet對象,這些servlet對象都會被放到一個集合當中(hashmap),隻有放到hashmap集合中的servlet才能夠被web容器管理,自己new的servlet對象不會被web容器管理(自己new的servlet對象不在管理中)

研究:伺服器在啟動的servlet對象有沒有被建立出來(預設情況下)

在servlet中提供一個無參數的構造方法,啟動伺服器的時候看看構造方法是否執行

預設情況下,伺服器在啟動的時候對象并不會被執行個體化

這個設計是合理的,使用者沒有發送請求之前,如果提前建立出來的所有的servlet對象,必然是耗費記憶體的,并且建立出來的如果一直沒有使用者通路,顯然這個對象是一個廢物,沒必要建立

怎麼讓伺服器啟動的時候建立Servlet對象呢?

  • 在servlet标簽中添加子标簽,在該子标簽中填寫整數,越小的整數優先級越高。

Servlet對象生命周期

  • 預設情況下伺服器啟動的時候AServlet對象并沒有被執行個體化
  • 使用者發送第一次請求的時候,控制台輸出了以下内容:
AServlet無參數構造方法執行了
AServlet's init method execute!
AServlet's service method execute!      
  • 根據以上輸出内容得出結論:
  • 使用者在發送第一次請求的時候Servlet對象被執行個體化(AServlet的構造方法被執行了。并且執行的是無參數構造方法。)
  • AServlet對象被建立出來之後,Tomcat伺服器馬上調用了AServlet對象的init方法。(init方法在執行的時候,AServlet對象已經存在了。已經被建立出來了。)
  • 使用者發送第一次請求的時候,init方法執行之後,Tomcat伺服器馬上調用AServlet對象的service方法。
  • 使用者繼續發送第二次請求,控制台輸出了以下内容:
AServlet's service method execute!      
  • 根據以上輸出結果得知,使用者在發送第二次,或者第三次請求的時候,對象并沒有建立,還是使用之前建立好的對象,直接調用該servlet對象的service方法,這說明:
  • 第一:對象是單例的,注意對象是單執行個體的,但是類并不符合單例模式,我們稱之為假單例,之是以單例是因為對象的建立我們程式員管不着,這個對象的建立隻能是tomcat說了算,tomcat隻建立了一個,是以導緻了單例但是屬于假單例。真單例模式,構造方法是私有化的
  • 第二:無參數構造方法,init方法隻在第一次使用者發送請求的時候執行,也就是說無參數構造方法隻執行一次,init方法也隻被tomcat伺服器調用一次
  • 第三:隻要使用者發送一次請求:servlce方法必然會被tomcat伺服器調用一次,發送100次請求,service方法會被調用100次

關閉伺服器的時候,控制台輸出了以下的内容

AServlet's destroy method execute!      

通過以上輸出内容,可以得出以下結論

servlet的destory方法隻被tomcat伺服器調用一次

destory方法是在什麼時候被調用的

在伺服器關閉的時候

因為伺服器關閉的時候要銷毀AServlet對象的記憶體

伺服器在銷毀AServlet對象記憶體之前,tomcat伺服器會自動調用AServlet對象的destroy方法

請問:destory方法調用的時候,對象銷毀了還是沒有銷毀呢

destroy方法執行的時候AServlet對象還在,沒有被銷毀,destroy方法執行結束之後,Aservlet對象的記憶體才會被tomcat銷毀

servlet對象更像人的一生

servlet的無參數構造方法執行:标志着人出生了。

init方法的執行:标志着你正在接受教育

servlet對象的service方法的執行:标志着你已經開始工作了,已經開始為人類提供服務了

destroy執行:标志臨終

🐱‍🐉11p 擴充卡模式改造servlet

當我們servlet類中編寫一個有參數的構造方法時,如果沒有手動編寫無參數構造方法時會出現什麼問題

報錯:500

500是一個http協定的錯誤狀态碼

500一般情況下是因為伺服器的Java程式出現了異常(伺服器内部錯誤)

如果沒有無參數的構造方法,會出現500錯誤,無法執行個體化servlet對象

是以,一定要注意,在servlet開發當中,不建議程式員來定義構造方法,因為定義不當,一不小心就會導緻無法執行個體化對象

思考:servlet的無參數構造方法是在對象第一次建立的時候執行,并且隻執行一次。init方法也是在對象第一次建立的時候執行,并且隻執行一次,那麼這個無參數可以代替嗎

  • 使用最多就是service方法,service方法是一定要實作的,因為service方法是處理使用者請求的核心方法。
  • 什麼時候使用init方法呢?
  • init方法很少用。
  • 通常在init方法當中做初始化操作,并且這個初始化操作隻需要執行一次。例如:初始化資料庫連接配接池,初始化線程池…
  • 什麼時候使用destroy方法呢?
  • destroy方法也很少用。
  • 通常在destroy方法當中,進行資源的關閉。馬上對象要被銷毀了,還有什麼沒有關閉的,抓緊時間關閉資源。還有什麼資源沒儲存的,抓緊時間儲存一下。