Request原理
Request
**1.原理
1.Tomcat服務器會根據請求url中的資源路徑,創建對應的ServletDemo01的對象。
2.Tomcat服務器,會創建request和response對象,request對象中封裝請求信息數據。
3.Tomcat將request和response兩個對象傳遞給service方法,并且調用service方法。(Tomcat利用反射的方式創建對象并且調用service方法)
4.程序員可以通過request對象獲取請求信息數據,通過response對象設置響應信息數據。
5.服務器在給瀏覽器做出響應之前,會從response對象中拿到程序員設置的響應消息數據。
這里要注意:request和response對象是Tomcat創建的,而我們只是負責使用而已。
**2.request對象繼承體系結構
ServletRequest -- 接口| 繼承 HttpServletRequest -- 接口| 實現 org.apache.catalina.connector.RequestFacade 類 (該類是Tomcat的,Tomcat時純java寫的)**3.request功能
***3.1.獲取請求行數據
代碼參考:https://github.com/yangmingyang/geektime-spring-test/blob/master/myWeb/src/cn/mingyang/web/w02_http/Demo02_http_request.java
1.獲取請求消息數據 1.獲取請求行數據* GET /day14/demo1?name=zhangsan HTTP/1.1方法:1.獲取請求方式:GET* String getMethod()2.獲取虛擬目錄:/day14* String getContextPath()3.獲取Servlet路徑:/demo1* String getServletPath()4.獲取get方式請參數:name=zhangsan* String getQueryString()5.獲取請求URI:/day14/demo1* String getRequestURI(): /day14/demo1* StringBuffer getRequestURL(): http://localhost/day14/demo1* URL:統一資源定位符:http://localhost/day14/demo1* URI:統一資源標識符:/day14/demo1注意:URI的范圍比URL的訪問大6.獲取協議及版本:HTTP/1.1* String getProtocol()7.獲取客戶端的ip地址* String getRemoteAddr()***3.2.獲取請求頭數據
方法* String getHeader(String name):通過請求頭的名稱獲取請求頭的值。* Enumeration<String> getHeaderNames():獲取所有的請求頭名稱。***3.3.獲取請求體數據
請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的參數 步驟:1.獲取流對象BufferedReader getReader():獲取字符輸入流,只能操作字符數據。ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據2.再從流對象中拿數據**4.其他功能
***4.1.獲取請求參數通用方法
無論GET還是POST請求方式都可以使用下列方法:
String getParameter(String name):根據參數名詞獲取參數值 String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 Enumeration<String> getParameterNames():獲取所有請求的參數名稱 Map<String,String[]> getParameterMap():獲取所有參數的map集合中文亂碼問題:get方式:Tomcat8以上版本已經將Get方式亂碼問題解決了。post方式:會亂碼解決:在獲取參數前,設置request的編碼request.setCharacterEncding("utf-8");?
***4.2.請求轉發
?一種在服務器內部的資源跳轉方式
步驟: 1.通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path). 2.使用RequestDispatcher對象來進行轉發: forward(ServletRequest request,ServletResponse response).特點: 1.瀏覽器地址欄路徑不發生變化。 2.只能轉發到當前服務器內部資源中。 3.轉發是一次請求。***4.3.共享數據
域對象:一個有作用范圍的對象,可在范圍內共享數據。 request域:代表一次請求的范圍,一般用于請求轉發的多個資源中共享數據。 方法: 1.void setAttribute(String name,Object obj):存儲數據 2.Object getAttitude(String name):通過鍵獲取值 3.void removeAttribute(String name):通過鍵移除鍵值對***4.4.獲取ServletContext
?
總結
- 上一篇: 阿里云Centos系统使用密钥对登陆
- 下一篇: Maven 配置环境变量后无法立刻生效-