问题小结(一)——servlet生命周期、get和post请求、内置对象、单例模式等
文章目錄
- 1. 說說jetty與tomcat的區(qū)別。
- 2. 如何修改jetty默認(rèn)端口?如何修改tomcat默認(rèn)端口?
- 2.1 修改jetty默認(rèn)端口
- 2.2 修改tomcat 默認(rèn)端口
- 3. 如何啟動jetty服務(wù)器?
- 4. 簡述Servlet的生命周期。
- 5. Servlet如何處理用戶的請求?
- 6. 說說get請求和post的請求的區(qū)別。
- 7. 說說相對地址與絕對地址的區(qū)別。
- 8. 說說請求重定向與請求轉(zhuǎn)發(fā)的區(qū)別。
- 9. jsp有哪九大內(nèi)置對象?servlet如何獲取session和application對象?
- 10. 什么是單例?單例有哪些設(shè)計模式?
1. 說說jetty與tomcat的區(qū)別。
相同點:
- tomcat與jetty都是一種servlet的引擎,他們都支持標(biāo)準(zhǔn)的servlet規(guī)范和javaEE規(guī)范
不同點:
- jetty更快,更靈活,內(nèi)核更小。默認(rèn)使用utf-8字符集,不存在中文亂碼情況,但不太適合做大型開放。
- tomcat比較傳統(tǒng),功能更強(qiáng)大,特別適合大型項目開發(fā),但經(jīng)常有中文亂碼情況,默認(rèn)使用ISO_8859_1字符集。
2. 如何修改jetty默認(rèn)端口?如何修改tomcat默認(rèn)端口?
2.1 修改jetty默認(rèn)端口
- 打開jetty安裝目錄下的start.ini文件
- 如下圖把端口修改為:8888
2.2 修改tomcat 默認(rèn)端口
- 打開tomcat安裝目錄下的server.xml文件
- 如下圖把端口修改為:8080
3. 如何啟動jetty服務(wù)器?
一般情況下都可以通過安裝目錄下的start.jar包來啟動jetty,除此之外,還可以通過dos命令,先進(jìn)入jetty的安裝文件夾,再輸入命令來進(jìn)行啟動。
啟動命令為:java -jar start.jar
4. 簡述Servlet的生命周期。
(1)加載和實例化
當(dāng)Servlet容器啟動或客戶端發(fā)送一個請求時,Servlet容器會查找內(nèi)存中是否存在該Servlet實例,若存在,則直接讀取該實例響應(yīng)請求,直接進(jìn)入步驟(3);如果不存在,就通過構(gòu)造方法創(chuàng)建一個Servlet實例。
(2) 初始化
實例化后,Servlet容器將調(diào)用Servlet的 init() 方法進(jìn)行初始化(一些準(zhǔn)備工作或資源預(yù)加載工作)。
(3)服務(wù)
初始化后,Servlet處于能響應(yīng)請求的就緒狀態(tài)。當(dāng)接收到客戶端請求時,調(diào)用service() 的方法處理客戶端請求,HttpServlet的service()方法會根據(jù)不同的請求 轉(zhuǎn)調(diào)不同的doXxx()方法:doGet()和doPost()。
(4)銷毀
重新發(fā)布項目,正常關(guān)閉tomcat時,會執(zhí)行destroy() 方法,如果非正常關(guān)閉,相當(dāng)于程序中斷,不會執(zhí)行方法。
5. Servlet如何處理用戶的請求?
- 針對 Servlet 的每次請求,Web 服務(wù)器在調(diào)用 service() 方法之前,都會創(chuàng)建 HttpServletRequest 和 HttpServletResponse 對象。簡稱 request 對象和response 對象。瀏覽器訪問 Servlet 的交互過程如下圖所示:
- 首先瀏覽器向 Web 服務(wù)器發(fā)送一個 HTTP 請求,Web 服務(wù)器根據(jù)收到的請求,會先創(chuàng)建一個 HttpServletRequest 和 HttpServletResponse 對象,然后再調(diào)用相應(yīng)的 Servlet 程序。
- 在 Servlet 程序運行時,它首先會從 HttpServletRequest 對象中讀取數(shù)據(jù)信息,然后通過 service() 方法處理請求消息,并將處理后的響應(yīng)數(shù)據(jù)寫入到 HttpServletResponse 對象中。最后,Web 服務(wù)器會從 HttpServletResponse 對象中讀取到響應(yīng)數(shù)據(jù),并發(fā)送給瀏覽器。
6. 說說get請求和post的請求的區(qū)別。
相同點:
- get和post都是http請求方式。(http請求方式遠(yuǎn)不止這兩種)
不同點:
- get 請求重點在從服務(wù)器上獲取資源,而post 請求重點在向服務(wù)器發(fā)送數(shù)據(jù)。
- get 請求過程中其參數(shù)在瀏覽器的地址欄的url中可見,所以隱私性安全性較差,且參數(shù)長度有限制,而 post 請求傳遞的參數(shù)放在Request body中,不會在地址欄的url中顯示,比GET要安全,且參數(shù)長度無限制。
- get 請求比較常見的方式是通過url地址欄請求,而post 請求最常見是通過form表單發(fā)送數(shù)據(jù)請求。
7. 說說相對地址與絕對地址的區(qū)別。
- 相對地址相對當(dāng)前資源的地址。 容易出錯,寫法簡單。
- 絕對地址放之四海而皆準(zhǔn)的地址。 肯定不會出錯,拼起來比較麻煩 。
- 舉例:假設(shè)你的網(wǎng)頁在如下位置:D:\WORK\web\111.html,而圖片在D:\WORK\web\images\111.jpg,有以下兩種情況:
①你在網(wǎng)頁中直接以D:\WORK\web\images\111.jpg這個路徑表示你的圖片。<這個就是圖片的絕對路徑>
②你在網(wǎng)頁中以: images\111.jpg來表示你的這個圖片。<這個是圖片的相對路徑>
8. 說說請求重定向與請求轉(zhuǎn)發(fā)的區(qū)別。
請求重定向(redirect):
- 語法:response.sendRedirect(url); 需要兩次請求,地址欄會發(fā)生改變,
request對象也會變,且request 里的屬性無法保存。
請求轉(zhuǎn)發(fā)(forward):
- 語法:request.getRequestDispatcher(url).forward(request,response); 需要一次請求,地址欄不會發(fā)生改變,request對象不變,且request 里的屬性可以保存。
9. jsp有哪九大內(nèi)置對象?servlet如何獲取session和application對象?
- jsp的九大內(nèi)置對象:out,page,request,response,session,application,exception,pageContext,config
其中常用的是:request,response,session,application - 獲取session對象:
request.getSession().setAttribute(“name”,“大胖”); //如獲取大胖這個對象 - 獲取application對象:
request.getServletContext().setAttribute(“nation”,“china”); //如獲取中國這個對象
10. 什么是單例?單例有哪些設(shè)計模式?
- 單例模式是一種常見的設(shè)計模式,單例模式的寫法有好幾種,主要介紹:懶漢式單例、餓漢式單例。
- 單例模式有以下特點:
(1)單例類只能有一個實例
(2)單例類必須自己創(chuàng)建自己的唯一實例
(3)單例類必須給所有其他對象提供這一實例
單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。在計算機(jī)系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機(jī)、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計成單例。選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。
形象比喻:餓漢主動找食物吃,懶漢躺在地上等著人喂。
public class MySun {//懶漢模式private static MySun sun; //單例對象private MySun(){ //私有構(gòu)造方法}//靜態(tài)工廠方法public static MySun getInstance(){if(sun==null){sun = new MySun();}return sun;} }①要想讓一個類只能構(gòu)建一個對象,自然不能讓它隨便去做new操作,因此MySun的構(gòu)造方法是私有的。
②sun是MySun類的靜態(tài)成員,也是我們的單例對象。它的初始值可以寫成null,也可以寫成new MySun()。
③getInstance()是獲取單例對象的方法。如果單例初始值是null,還未構(gòu)建,則構(gòu)建單例對象并返回。這個寫法屬于單例中的懶漢模式。如果單例對象一開始就被new MySun()主動構(gòu)建,則不再需要判空操作,這種寫法屬于餓漢模式。
總結(jié)
以上是生活随笔為你收集整理的问题小结(一)——servlet生命周期、get和post请求、内置对象、单例模式等的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb(九)——JavaBean
- 下一篇: 问题小结(二)——maven的核心功能、