卷妹的成長日記之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方法當中,進行資源的關閉。馬上對象要被銷毀了,還有什麼沒有關閉的,抓緊時間關閉資源。還有什麼資源沒儲存的,抓緊時間儲存一下。