原理
HTTP在后端里面的使用,就是通過(guò)request和response來(lái)設(shè)置的患雇!
- request和response對(duì)象是由服務(wù)器創(chuàng)建的贯涎。我們來(lái)使用它們。
- request對(duì)象是來(lái)獲取請(qǐng)求消息共屈,response對(duì)象是來(lái)設(shè)置響應(yīng)消息。
image
Request
一党窜、request對(duì)象繼承體系結(jié)構(gòu)
ServletRequest -- 接口
| 繼承
HttpServletRequest -- 接口
| 實(shí)現(xiàn)
org.apache.catalina.connector.RequestFacade 類(tomcat)
二拗引、獲取請(qǐng)求消息
1.獲取請(qǐng)求行數(shù)據(jù)
栗子
GET /day14/demo1?name=zhangsan HTTP/1.1
方法
- 獲取請(qǐng)求方式 :GET
- String getMethod()
-
獲取虛擬目錄:/day14
- String getContextPath()
- 獲取Servlet路徑: /demo1
- String getServletPath()
- 獲取get方式請(qǐng)求參數(shù):name=zhangsan
- String getQueryString()
-
獲取請(qǐng)求URI:/day14/demo1
- String getRequestURI() 【/day14/demo1】
- StringBuffer getRequestURL() 【http://localhost/day14/demo1】
- 獲取協(xié)議及版本:HTTP/1.1
- String getProtocol()
- 獲取客戶機(jī)的IP地址
- String getRemoteAddr()
2.獲取請(qǐng)求頭數(shù)據(jù)
- String getHeader(String name):通過(guò)請(qǐng)求頭的名稱獲取請(qǐng)求頭的值
- Enumeration<String> getHeaderNames():獲取所有的請(qǐng)求頭名稱
3.獲取請(qǐng)求體數(shù)據(jù)
- 請(qǐng)求體:只有POST請(qǐng)求方式,才有請(qǐng)求體幌衣,在請(qǐng)求體中封裝了POST請(qǐng)求的請(qǐng)求參數(shù)
- 步驟
- 獲取流對(duì)象
- BufferedReader getReader():獲取字符輸入流矾削,只能操作字符數(shù)據(jù)
- ServletInputStream getInputStream():獲取字節(jié)輸入流,可以操作所有類型數(shù)據(jù)
- 再?gòu)牧鲗?duì)象中拿數(shù)據(jù)
- 獲取流對(duì)象
三豁护、其他功能
1.獲取請(qǐng)求參數(shù)通用方式
- String getParameter(String name) : 根據(jù)參數(shù)名稱獲取參數(shù)值 username=zs&password=123
- String[] getParameterValues(String name) : 根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game
- Enumeration<String> getParameterNames() : 獲取所有請(qǐng)求的參數(shù)名稱
- Map<String,String[]> getParameterMap() : 獲取所有參數(shù)的map集合
中文亂碼問(wèn)題
- get方式:tomcat 8 已經(jīng)將get方式亂碼問(wèn)題解決了
- post方式:會(huì)亂碼【在獲取參數(shù)前哼凯,設(shè)置request的編碼request.setCharacterEncoding("utf-8")】
2.請(qǐng)求轉(zhuǎn)發(fā)
一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式
步驟
- 通過(guò)request對(duì)象獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher對(duì)象來(lái)進(jìn)行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher("/RequestDemo9").forward(request, response);
特點(diǎn)
- 瀏覽器地址欄路徑不發(fā)生變化
- 只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部資源中。
- 轉(zhuǎn)發(fā)是一次請(qǐng)求
3.共享數(shù)據(jù)
域?qū)ο螅阂粋€(gè)有作用范圍的對(duì)象楚里,可以在范圍內(nèi)共享數(shù)據(jù)
request域:代表一次請(qǐng)求的范圍断部,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù)
-
方法
- void setAttribute(String name,Object obj):存儲(chǔ)數(shù)據(jù)
- Object getAttitude(String name):通過(guò)鍵獲取值
- void removeAttribute(String name):通過(guò)鍵移除鍵值對(duì)
4.獲取ServletContext
- ServletContext getServletContext()
Response
一、設(shè)置響應(yīng)行
- 格式:HTTP/1.1 200 ok
- 設(shè)置狀態(tài)碼:setStatus(int sc)
二班缎、設(shè)置響應(yīng)頭
- setHeader(String name, String value)
三蝴光、設(shè)置響應(yīng)體
- 獲取輸出流
- 字符輸出流:PrintWriter getWriter()
- 字節(jié)輸出流:ServletOutputStream getOutputStream()
- 使用輸出流她渴,將數(shù)據(jù)輸出到客戶端瀏覽器
四、案例
1.重定向
image
重定向是一種資源的跳轉(zhuǎn)方式
代碼實(shí)現(xiàn)
//1. 設(shè)置狀態(tài)碼為302
response.setStatus(302);
//2.設(shè)置響應(yīng)頭location
response.setHeader("location","/day15/responseDemo2");
//簡(jiǎn)單的重定向方法
response.sendRedirect("/day15/responseDemo2");
轉(zhuǎn)發(fā)(forward)和重定向(redirect)區(qū)別
- 轉(zhuǎn)發(fā)地址欄路徑不變蔑祟,重定向地址欄發(fā)生變化
- 轉(zhuǎn)發(fā)只能訪問(wèn)當(dāng)前服務(wù)器下的資源趁耗,重定向可以訪問(wèn)其他站點(diǎn)(服務(wù)器)的資源
- 轉(zhuǎn)發(fā)是一次請(qǐng)求,使用request對(duì)象來(lái)共享數(shù)據(jù)疆虚;重定向是兩次請(qǐng)求苛败,不能使用request對(duì)象來(lái)共享數(shù)據(jù)
2.服務(wù)器輸出字符數(shù)據(jù)到瀏覽器
// 設(shè)置編碼
response.setContentType("text/html;charset=utf-8");
//1. 獲取字符輸出流
PrintWriter pw = response.getWriter();
//2. 輸出數(shù)據(jù)
pw.write("你好! mouwneg");
注意
- 獲取的流的默認(rèn)編碼是ISO-8859-1
- 設(shè)置該流的默認(rèn)編碼径簿,告訴瀏覽器響應(yīng)體使用的編碼罢屈。如上代碼所示!
3.服務(wù)器輸出字節(jié)數(shù)據(jù)到瀏覽器
// 設(shè)置編碼
response.setContentType("text/html;charset=utf-8;");
//1. 獲取字節(jié)輸出流
ServletOutputStream sos = response.getOutputStream();
//2. 輸出數(shù)據(jù)
sos.write("可以輸出中文!!!".getBytes());
4.驗(yàn)證碼
- 本質(zhì):圖片(可以上網(wǎng)找?guī)讉€(gè)圖片生成的代碼直接用)
- 目的:防止惡意表單注冊(cè)
ServletContext對(duì)象
一篇亭、概念
代表整個(gè)web應(yīng)用儡遮,可以和程序的容器(服務(wù)器)來(lái)通信
二、獲取
- 通過(guò)request對(duì)象獲劝蹈稀: request.getServletContext();
- 通過(guò)HttpServlet獲缺杀摇:this.getServletContext();
三、功能
1.獲取MIME類型
- MIME類型:在互聯(lián)網(wǎng)通信過(guò)程中定義的一種文件數(shù)據(jù)類型
- 格式: 大類型/小類型 蹂随、 text/html 十嘿、 image/jpeg
2.域?qū)ο螅汗蚕頂?shù)據(jù)
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
作用域的范圍是所有用戶的數(shù)據(jù)
3.獲取文件的真實(shí)(服務(wù)器)路徑
- 方法:String getRealPath(String path)