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