Servlet,HTTP,Ruquest,Response
目錄
一.Servlet3.0
1.1好處
1.2步驟
1.3相關配置
二.HTTP協議
2.1請求消息
1. 請求行
2. 請求頭
3. 請求空行4. 請求體
2.2響應消息
1. 響應行
2. 響應頭:
3.響應空行
4.響應體:傳輸的數據
三.Request
四.Response
一.Servlet3.0
1.1好處
????????支持注解配置。可以不需要web.xml了。
1.2步驟
????????1. 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml
?? ??? ?2. 定義一個類,實現Servlet接口
?? ??? ?3. 復寫方法
?? ??? ?4. 在類上使用@WebServlet注解,進行配置
?? ??? ??? ?* @WebServlet("資源路徑")
1.3相關配置
?? ?1. urlpartten:Servlet訪問路徑
?? ??? ?1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})
?? ??? ?2. 路徑定義規則:
?? ??? ??? ?1. /xxx:路徑匹配
?? ??? ??? ?2. /xxx/xxx:多層路徑,目錄結構
?? ??? ??? ?3. *.do:擴展名匹配
二.HTTP協議
2.1請求消息
1. 請求行
請求方式 請求url 請求協議/版本
?? ??? ?GET /login.html?? ?HTTP/1.1
?? ??? ?* 請求方式:
?? ??? ??? ?* HTTP協議有7中請求方式,常用的有2種
?? ??? ??? ??? ?* GET:
?? ??? ??? ??? ??? ?1. 請求參數在請求行中,在url后。
?? ??? ??? ??? ??? ?2. 請求的url長度有限制的
?? ??? ??? ??? ??? ?3. 不太安全
?? ??? ??? ??? ?* POST:
?? ??? ??? ??? ??? ?1. 請求參數在請求體中
?? ??? ??? ??? ??? ?2. 請求的url長度沒有限制的
?? ??? ??? ??? ??? ?3. 相對安全
2. 請求頭
1. User-Agent:瀏覽器告訴服務器,我訪問你使用的瀏覽器版本信息
?? ??? ??? ??? ?* 可以在服務器端獲取該頭的信息,解決瀏覽器的兼容性問題
?? ??? ??? ?2. Referer:http://localhost/login.html
?? ??? ??? ??? ?* 告訴服務器,我(當前請求)從哪里來?
?? ??? ??? ??? ??? ?* 作用:
?? ??? ??? ??? ??? ??? ?1. 防盜鏈:
?? ??? ??? ??? ??? ??? ?2. 統計工作:
3. 請求空行
4. 請求體
* 封裝POST請求消息的請求參數的
2.2響應消息
1. 響應行
?1. 組成:協議/版本 響應狀態碼 狀態碼描述
?? ?2. 響應狀態碼:服務器告訴客戶端瀏覽器本次請求和響應的一個狀態。
?? ??? ?1. 狀態碼都是3位數字?
?? ??? ?2. 分類:
?? ??? ??? ?1. 1xx:服務器就收客戶端消息,但沒有接受完成,等待一段時間后,發送1xx多狀態碼
?? ??? ??? ?2. 2xx:成功。代表:200
?? ??? ??? ?3. 3xx:重定向。代表:302(重定向),304(訪問緩存)
?? ??? ??? ?4. 4xx:客戶端錯誤。
?? ??? ??? ??? ?* 代表:
?? ??? ??? ??? ??? ?* 404(請求路徑沒有對應的資源)?
?? ??? ??? ??? ??? ?* 405:請求方式沒有對應的doXxx方法
?? ??? ??? ?5. 5xx:服務器端錯誤。代表:500(服務器內部出現異常)
2. 響應頭:
1. 格式:頭名稱: 值
?? ?2. 常見的響應頭:
?? ??? ?1. Content-Type:服務器告訴客戶端本次響應體數據格式以及編碼格式
?? ??? ?2. Content-disposition:服務器告訴客戶端以什么格式打開響應體數據
?? ??? ??? ?* 值:
?? ??? ??? ??? ?* in-line:默認值,在當前頁面內打開
?? ??? ??? ??? ?* attachment;filename=xxx:以附件形式打開響應體。文件下載
3.響應空行
4.響應體:傳輸的數據
三.Request
?? ?原理
?? ??? ?request對象是來獲取請求消息,response對象是來設置響應消息
?? ?功能
?? ??? ?請求行數據
?? ??? ??? ?* 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?? ??? ??? ??? ??? ?共和國
?? ??? ??? ??? ?
?? ??? ??? ??? ?6. 獲取協議及版本:HTTP/1.1
?? ??? ??? ??? ??? ?* String getProtocol()
?? ??? ??? ??? ?7. 獲取客戶機的IP地址:
?? ??? ??? ??? ??? ?* String getRemoteAddr()
?? ??? ?請求頭數據
?? ??? ??? ?* 方法:
?? ??? ??? ??? ?* (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值
?? ??? ??? ??? ?* Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
?? ??? ?請求體數據
?? ??? ??? ?* 請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求參數
?? ??? ??? ?* 步驟:
?? ??? ??? ??? ?1. 獲取流對象
?? ??? ??? ??? ??? ?* ?BufferedReader getReader():獲取字符輸入流,只能操作字符數據
?? ??? ??? ??? ??? ?* ?ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
?? ??? ??? ??? ??? ??? ?* 在文件上傳知識點后講解
?? ??? ??? ??? ?2. 再從流對象中拿數據
?? ??? ?其他功能
?? ??? ??? ??? ??? ?1. ?不論get還是post請求方式都可以使用下列方法來獲取請求參數
?? ??? ??? ?1. String getParameter(String name):根據參數名稱獲取參數值 ? ?username=zs&password=123
?? ??? ??? ?2. String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 ?hobby=xx&hobby=game
?? ??? ??? ?3. Enumeration<String> getParameterNames():獲取所有請求的參數名稱
?? ??? ??? ?4. Map<String,String[]> getParameterMap():獲取所有參數的map集合
?? ??? ?中文亂碼問題
?? ??? ??? ??? ?* get方式:tomcat 8 已經將get方式亂碼問題解決了
?? ??? ??? ??? ?* post方式:會亂碼
?? ??? ??? ??? ??? ?* 解決:在獲取參數前,設置request的編碼request.setCharacterEncoding("utf-8");
?? ??? ?請求轉發
?? ??? ??? ?1. 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
?? ??? ??? ??? ?2. 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)?
?? ??? ??? ? request.getRequestDispatcher("/FailServlet").forward(request,response);
?? ??? ?共享數據
?? ??? ??? ?* 域對象:一個有作用范圍的對象,可以在范圍內共享數據
?? ??? ??? ?* request域:代表一次請求的范圍,一般用于請求轉發的多個資源中共享數據
?? ??? ??? ?* 方法:
?? ??? ??? ??? ?1. void setAttribute(String name,Object obj):存儲數據
?? ??? ??? ??? ?2. Object getAttitude(String name):通過鍵獲取值
?? ??? ??? ??? ?3. void removeAttribute(String name):通過鍵移除鍵值對
?? ??? ??? ?* 注意:這個放于forward方法的上面,不然響應太快會導致無法獲取信息!
?? ??? ??? ?request.setAttribute("user",user);
User user =(User) request.getAttribute("user");
?? ??? ?獲取SeevletContext
?? ??? ??? ?獲取
?? ??? ??? ??? ??? ?1. 通過request對象獲取
?? ??? ?request.getServletContext();
?? ?2. 通過HttpServlet獲取
?? ??? ?this.getServletContext();
?? ??? ??? ?概念
?? ??? ??? ??? ?代表整個web應用,可以和程序的容器(服務器)來通信
?? ??? ??? ?功能
?? ??? ??? ??? ?1.獲取MIME類型
?? ??? ??? ??? ??? ?* MIME類型:在互聯網通信過程中定義的一種文件數據類型
?? ??? ??? ?* 格式: 大類型/小類型 ? text/html?? ??? ?image/jpeg
?? ??? ?* 獲取:String getMimeType(String file) ?
?? ??? ??? ??? ?2. 域對象:共享數據
?? ??? ??? ??? ??? ?1. setAttribute(String name,Object value)
?? ??? ??? ??? ??? ?2. getAttribute(String name)
?? ??? ??? ??? ??? ?3. removeAttribute(String name)
?? ??? ??? ??? ?3. 獲取文件的真實(服務器)路徑
?? ??? ??? ??? ??? ?1. 方法:String getRealPath(String path) ?
?? ??? ??? ??? ??? ??? ? String b = context.getRealPath("/b.txt");//web目錄下資源訪問
?? ??? ??? ??? ??? ? ? ? ? ? System.out.println(b);
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ? ? ? ? ?String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問
?? ??? ??? ??? ??? ? ? ? ? ?System.out.println(c);
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ? ? ? ? ?String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問
?? ??? ??? ??? ??? ? ? ? ? ?System.out.println(a);
四.Response
功能
?? ?1. 設置響應行
?? ??? ?1. 格式:HTTP/1.1 200 ok
?? ??? ?2. 設置狀態碼:setStatus(int sc)?
?? ?2. 設置響應
?? ??? ?
?? ??? ?2. 設置響應頭:setHeader(String name, String value)?
?? ?3. 設置響應體:
?? ??? ?* 使用步驟:
?? ??? ??? ?1. 獲取輸出流
?? ??? ??? ??? ?* 字符輸出流:PrintWriter getWriter()
?? ??? ?
?? ??? ??? ?* 字節輸出流:ServletOutputStream getOutputStream()
?? ??? ?
?? ??? ??? ?2. 使用輸出流,將數據輸出到客戶端瀏覽器
?? ?案例:重定向
?? ??? ?//1. 設置狀態碼為302
?? ? ? ? ? ?response.setStatus(302);
?? ??? ?2.設置響應頭location ?response.sendRedirect("/day15/responseDemo2")
?? ?重定向,轉發對比
?? ??? ??? ??? ?* 重定向的特點:redirect
?? ??? ??? ?1. 地址欄發生變化
?? ??? ??? ?2. 重定向可以訪問其他站點(服務器)的資源
?? ??? ??? ?3. 重定向是兩次請求。不能使用request對象來共享數據
?? ??? ?* 轉發的特點:forward
?? ??? ??? ?1. 轉發地址欄路徑不變
?? ??? ??? ?2. 轉發只能訪問當前服務器下的資源
?? ??? ??? ?3. 轉發是一次請求,可以使用request對象來共享數據
總結
以上是生活随笔為你收集整理的Servlet,HTTP,Ruquest,Response的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bit-Z携手Bit-MY落户马来西亚
- 下一篇: Bit-Z开展BTC交易赛 赢200倍交