一、request的運行流程
首先,自己寫一個web工程,也就是建一個工程;當把該web工程發布到Tomcat服務器當中,可以讓外界訪問,這就成了一個web應用。
在客戶端輸入一個網站,是web應用資源的地址URL,該請求會在瀏覽器客戶端自動生成一個http請求,然后客戶端會將相應的請求發送到相應的服務器內部,服務器首先由Tomcat引擎接收該請求,然后Tomcat引擎會分析http協議上的請求行,該請求行上面有請求方式,根據請求方式是get還是post從而確定調用是doGet方法還是doPost方法,請求行上面有地址,Tomcat會幫你找該地址在的Tomcat服務器內部的某一個web應用(Tomcat容器中web-app下可以存放多個web應用),找到對應的web應用之后,開始創建對象,默認第一次訪問創建對象,默認調用servlet方法,重寫servlet方法之后會調用doGet方法或者doPost方法,當調用doGet方法的時候,需要兩個參數。一個是request,一個是response,這兩個參數,誰去調用改doGet方法管提供這個倆個參數,doGet方法由Tomcat引擎負責調用,它在調用的時候,幫你創建兩個對象,一個是request代表請求,一個是response代表響應。其中request內部封裝http請求的所有內容;response是空的,因為它代表響應,response有自己的緩沖區,可以向緩沖區里面添加內容,可以添加響應行、響應頭、響應體(分別有對應的方法),添加完成之后,Tomcat引擎會獲取緩沖區內容,會組裝成http響應的東西,然后發送到客戶端,通過裝包也可看到,客戶端獲得這些內容會自動根據響應進行解析,最終在頁面上顯示響應體的內容。
二、ServletContext域和Request域的生命周期
ServletContext
創建:服務器啟動
銷毀:服務器關閉
域的作用范圍:整個web應用
Request
創建: 訪問時創建request對象
銷毀:響應結束request銷毀
(生命周期為一瞬間)
域的作用范圍:一次請求中
三、轉發和重定向的區別
1).重定向兩次請求 轉發一次請求
2).重定向的地址欄的地址變化 轉發的地址不變
3).重定向可以訪問外部網站 轉發不能訪問外部網站,只能訪問內部資源
4).轉發的性能要優于重定向
四、客戶端地址與服務器端地址的區別
客戶端地址:是客戶端去訪問服務器的地址,服務器外部的地址
客戶端地址必須寫上web應用的名稱,代表要去Tomcat容器中去找哪個web應用
例如:
直接輸入地址
重定向
也就是,只要是服務器外部跳出服務器,然后再去訪問服務器內部的資源,豆角客戶端地址
服務器端地址:是服務器內部資源跳轉訪問的地址
不需要寫web應用的名稱
例如:
轉發
總結:
request獲得請求行的內容
獲得請求方式:request.getMethod();
獲得請求資源:request.getRequestURI();
request.getRequestURL();這個長,協議、主機名、端口都有
動態獲得web應用的名稱:request.getContextPath();
獲得客戶機的一些信息:request.getRemoteAddr();
request獲得請求頭的內容
request.getHeader(name);
request獲得請求體(請求參數)
request.getParameter(name);//返回值為String
request.getParameterMap();//將所有的數據以Map形式封裝,返回值為Map<String ,String[]>
request.getParameterValues(name);//返回值為String[]字符串數組
注意: 客戶端發送的參數,到服務器端獲得后都是字符串
獲得中文亂碼 的解決:
post提交: request.setCharacterEncoding("UTF-8");
get提交: parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");//先用iso8859-1默認編碼再用UTF-8解碼
request轉發和域
轉發:request.getRequestDispather(轉發的地址,服務器內部的地址,不需要web應用名稱).forward(request, response);
例如:request.getRequestDispatcher("/login.jsp").forward(request, response);
存:request.setAttribute(name,value);
取:request.getAttribute(name,value);//取的時候需要強轉一下