柚子快報(bào)激活碼778899分享:后端 Servlet原理解析
柚子快報(bào)激活碼778899分享:后端 Servlet原理解析
Servlet簡(jiǎn)介
Servlet是運(yùn)行在服務(wù)端的Java小程序,是SUN公司提供一套規(guī)范, 用來(lái)處理客戶端請(qǐng)求、響應(yīng)給瀏覽器的動(dòng)態(tài)資源。
Servlet的任務(wù)有:
1.獲取請(qǐng)求數(shù)據(jù)2.處理請(qǐng)求3.完成響應(yīng)
在Java Web 程序中, Servlet 主要負(fù)責(zé)接收用戶請(qǐng)求 HttpServletRequest , 在 doGet() , doPost() 中做相應(yīng)的處理,并將 HttpServletResponse 反饋給用戶。
Servlet 可以設(shè)置初始化參數(shù),供 Servlet 內(nèi)部使用。 一個(gè) Servlet 類只會(huì)有一個(gè)實(shí)例,在它初始化時(shí)調(diào)用 init() 方法,銷毀時(shí)調(diào)用 destroy() 方法。 Servlet需要在web.xml中配置(MyEclipse中創(chuàng)建Servlet會(huì)自動(dòng)配置) , 一個(gè)Servlet可以設(shè)置多個(gè)URL訪問。
Servlet 不是線程安全的,因此要謹(jǐn)慎使用類變量。
Servlet中的方法
Servlet 接口定義了 5 個(gè)方法:
void init(ServletConfig config) throws ServletException
void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
void destory()
java.lang.String getServletInfo()
ServletConfig getServletConfig()
其中init()、service() 和 destroy()方法和 Servlet 生命周期有關(guān)。所謂Servlet生命周期,就是 Servlet 對(duì)象從創(chuàng)建到銷毀的過(guò)程。
Servlet規(guī)范規(guī)定,所有的servlet必須實(shí)現(xiàn) javax.servlet.Servlet接口。 Web容器加載Servlet并將其實(shí)例化后,Servlet生命周期開始:
容器運(yùn)行其init()方法進(jìn)行Servlet的初始化
請(qǐng)求到達(dá)時(shí)調(diào)用Servlet的service()方法,service()方法會(huì) 根據(jù)需要調(diào)用與請(qǐng)求對(duì)應(yīng)的 doGet 或 doPost 等方法。
當(dāng)服務(wù)器關(guān)閉或項(xiàng)目被卸載時(shí)服務(wù)器會(huì)將Servlet實(shí)例銷毀,此時(shí)會(huì)調(diào)用Servlet的destroy()方法。
注意:
init 方法和 destory 方法只會(huì)執(zhí)行一次,而 service 方法當(dāng)客戶端每次請(qǐng)求Servlet都會(huì)執(zhí)行。 Servlet中有時(shí)會(huì)用到一些需要初始化與銷毀的資源, 因此可以把初始化資源的代碼放入init方法中,銷毀資源的代碼放入destroy方法中, 這樣就不需要每次處理客戶端的請(qǐng)求都要初始化與銷毀資源。
Servlet與線程安全
Servlet不是線程安全的,多線程并發(fā)的讀寫會(huì)導(dǎo)致數(shù)據(jù)不同步的問題。 解決的辦法是盡量不要定義name屬性,而是要把name變量分別定義在doGet()和doPost()方法內(nèi)。 雖然使用 synchronized 語(yǔ)句塊可以解決問題,但是會(huì)造成線程的等待,不是很科學(xué)的辦法。
注意:
多線程的并發(fā)的讀寫Servlet類屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。 但是如果只是并發(fā)地讀取屬性而不寫入,則不存在數(shù)據(jù)不同步的問題。 因此Servlet里的只讀屬性最好定義為final類型的。
Get和Post請(qǐng)求的區(qū)別
Get請(qǐng)求Post請(qǐng)求用途用來(lái)從服務(wù)器上獲得資源用來(lái)向服務(wù)器提交數(shù)據(jù)傳輸數(shù)據(jù)格式將表單中數(shù)據(jù)按照 name=value 的形式,添加到 action 所指向的URL 后面,并且兩者使用"?"連接,而各個(gè)變量之間使用"&"連接將表單中的數(shù)據(jù)放在HTTP協(xié)議的請(qǐng)求頭或消息體中,傳遞到action所指向URL傳輸數(shù)據(jù)限制受到URL長(zhǎng)度限制(1024字節(jié)即256個(gè)字符)可以傳輸大量的數(shù)據(jù),上傳文件通常要使用post方式參數(shù)參數(shù)會(huì)顯示在地址欄上,如果這些數(shù)據(jù)不是敏感數(shù)據(jù),那么可以使用get對(duì)于敏感數(shù)據(jù)還是應(yīng)用使用post典型應(yīng)用GET方式提交表單的典型應(yīng)用是搜索引擎,GET方式就是被設(shè)計(jì)為查詢用的上傳文件
轉(zhuǎn)發(fā)和重定向的區(qū)別
轉(zhuǎn)發(fā)(Forward)
轉(zhuǎn)發(fā)(Forword)通過(guò) RequestDispatcher 對(duì)象的 forward(HttpServletRequest request,HttpServletResponse response)方法實(shí)現(xiàn)的。 RequestDispatcher可以通過(guò)HttpServletRequest 的getRequestDispatcher()方法獲得。
重定向(Redirect)
重定向(Redirect)是利用服務(wù)器返回的狀態(tài)碼來(lái)實(shí)現(xiàn)的。 客戶端瀏覽器請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器會(huì)返回一個(gè)狀態(tài)碼。 服務(wù)器通過(guò)HttpServletRequestResponse的setStatus(int status)方法設(shè)置狀態(tài)碼。 如果服務(wù)器返回301或者302,則瀏覽器會(huì)到新的網(wǎng)址重新請(qǐng)求該資源。
轉(zhuǎn)發(fā)(Forward)重定向(Redirect)地址欄顯示服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器。瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址。所以地址欄顯示的是新的URL數(shù)據(jù)共享轉(zhuǎn)發(fā)頁(yè)面和轉(zhuǎn)發(fā)到的頁(yè)面可以共享request里面的數(shù)據(jù)不能共享數(shù)據(jù)應(yīng)用一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊一般用于用戶注銷登陸時(shí)返回主頁(yè)面和跳轉(zhuǎn)到其它的網(wǎng)站等效率高低
推薦閱讀:
程序員面試手冊(cè)編程筆記
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!
柚子快報(bào)激活碼778899分享:后端 Servlet原理解析
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。