小白的進階之路14
---恢復內容開始---
servlet 是Javaweb的三大組件之一。
三大組件:servlet,filter,lisoner
客戶端通過服務器想瀏覽器發出請求。
我們所寫的AServlet、BServlet,都是由我們實現servlet接口的實現類。
servlet是單例的,一個類一個servlet,他們的功能是不同的。但他是線程不安全的,而且效率是高的。有可能出現一個servlet處理同時處理多個請求,所以最好不要在servlet中隨便創建成員變量,有可能出現一個線程是讀操作,另一個線程是寫操作,這樣就出現線程不安全的問題。但如果是只讀,或者只寫操作還可以。
servlet 類我們寫(比如執行什麽功能),但是對象由Tomcat創建。
servlet完成的三大塊:
獲取請求數據、 請求處理、完成響應。
servlet的三大生命周期方法:init(),//第一次請求servlet則創建。destroy()//Tomcat關閉則死亡。
service(),,,//可以多次調用,每次處理請求都會調用。
而這些方法都是由Tomcat調用,調用destory則servlet死亡,關閉Tomcat則死亡。
tomcat怎麽訪問servlet,servlet只是一個java類???
需要用xml配置文件,將servlet和URL的路徑綁在一起。
在xml配置中,獲取初始化參數。
獲取初始化參數
需要調用service時,Tomcat將service的兩個參數強轉成httpservletrequest,和 httpservletresponse類型。然後通過httpservletreques得到當前的請求方式,是post還是get,如果是post,則調用doPost方法,如果是get,則調用get方法。
4打頭,是客戶端的錯誤。
一般情況下,servlet的創建時第一次被調用的時候,但是可以設置xml文件實現服務器開啟時就創建。
圖中的<load-on-startup> 表示第一次開啟的時候就創建的順序。
ServletContext==application
生命周期在服務器開啟時創建,服務器關閉時死亡。
一個項目只有一個servletcontext對象。
servletconfig()。getservletContext();
正常我們創建一個servlet會繼承httpservlet
public void servlet extends httpservlet(){
………………}
但其實,httpservlet繼承了servletconfig接口。
javaweb中有四大域對象,即pageContext,servletContext,servletrequest,httpsession。
域對象是什麽?有什麽作用?
域對象不需要創建直接在servlet區域中調用,作用是保存數據以及servlet之間的數據傳遞。所以域對象有兩大功能,第一存數據,第二取數據。
servletcontext可以設置全局的初始化參數,此初始化參數不屬於任何一個servlet
下面是一個小練習:
訪問量的統計。
第一次訪問的時候建立一個int型的變量在servletcontext這個對象中,之後的每次訪問都+1;
首先,第一次訪問的時候用setattribute()這個函數來創建一個屬性,
將輸入流轉化為字符串,需要用到commons.ioUtils這個工具類。
URI=項目名+servlet路徑:、/goods/AServlet
URL:不包含路徑的參數的請求路徑。即?之後全沒有
獲取請求參數,用戶向服務器發出請求,如果請求參數在請求體中,則是post請求,如果是URL中,則是get請求。
其中第一個和最後一個最為常用。
轉發是一個請求,跨多個servlet,但是使用一個request和response域。
這是轉發,request.getRequestDispatcher("/TwoServlet").forword(request,reponse);
請求轉發是只顯示轉發至的servlet響應體。
在轉發中,留頭不留體,比如AServlet轉發至BServlet,在A中設置響應頭和響應體,在B中設置響應體,那麽,A中只會留頭(為了證明|A參與)不會留體,只會留B中的體。、
轉發地址欄不會發生變化,如果想地址欄發生變化,那麽必須使用重定向。如果想在下一個servlet中獲得request域中的數據,那麽必須使用轉發。
服務器默認編碼是iso8859-1;而瀏覽器默認的編碼是gbk;但是Tomcat8的默認編碼是utf-8;
響應編碼:不亂碼,只需加上response.setContextType("text/thml";"charset=utf-8");
請求編碼:頁面是什麽編碼,那麽獲得請求參數就是什麽編碼。在獲得請求參數之前,要加上request.setCharacterEncoding("utf-8");然後在用request.getParameter("XXX");
以“/”開頭,則是絕對路徑,絕對路徑要加項目名+。。。
不以“/”開頭,則是相對路徑
---恢復內容結束---
小白的進階之路14