HttpServletRequest
常用對(duì)象
常用方法?
?獲取請(qǐng)求時(shí)的完整路徑 (從http開始吼蚁,到"?"前面結(jié)束)
System.out.println("獲取請(qǐng)求時(shí)的完整路徑:"? + request.getRequestURL());
獲取請(qǐng)求時(shí)的部分路徑 (從站點(diǎn)名開始谒麦,到"?"前面結(jié)束)
System.out.println("獲取請(qǐng)求時(shí)的部分路徑:" + request.getRequestURI());
?獲取請(qǐng)求時(shí)的參數(shù)字符串 (從"?"開始到最后)
System.out.println("獲取請(qǐng)求時(shí)的參數(shù)字符串:" + request.getQueryString());
?獲取請(qǐng)求類型 (GET|POST)
System.out.println("獲取請(qǐng)求類型:" + request.getMethod());
獲取請(qǐng)求協(xié)議版本? (HTTP/1.1)
System.out.println("獲取請(qǐng)求協(xié)議版本: " +request.getProtocol());
?獲取站點(diǎn)名 (webapp的名稱)
System.out.println("獲取站點(diǎn)名: " +request.getContextPath());
請(qǐng)求亂碼的解決
?亂碼的原因:
?request在解析數(shù)據(jù)時(shí)使用的編碼格式是ISO-8859-1,該編碼本身就不支持中文肯腕。
解決方案:
1、設(shè)置request的解析編碼(只針對(duì)于POST請(qǐng)求有效)
?request.setCharacterEncoding("UTF-8");
?2柏肪、通過new String()將ISO-8859-1的編碼轉(zhuǎn)換為UTF-8
?new String(request.getParamter(name).getBytes("ISO-8859-1"),"UTF-8");
?POST請(qǐng)求 GET請(qǐng)求
?Tomcat8? ? ?????亂碼? ????? ? ? ? ? ? ?不亂碼
?request.setCharacterEncoding("UTF-8"); 不處理
Tomcat7? ? ? ????亂碼? ? ? ? ????????? ?亂碼
request.setCharacterEncoding("UTF-8");? ? ? ? ? ? ? new String(request.getParamter(name).getBytes("ISO-8859-1"),"UTF-8");
請(qǐng)求轉(zhuǎn)發(fā)跳轉(zhuǎn)
? 概念: 請(qǐng)求轉(zhuǎn)發(fā)是一種服務(wù)端的跳轉(zhuǎn)方式召衔,是服務(wù)端行為
?格式:request.getRequestDispatcher("地址").forward(request, response);
特點(diǎn):
1、服務(wù)端行為蘸际,服務(wù)端跳轉(zhuǎn)
?2座哩、瀏覽器的地址不發(fā)生改變
3、從始至終只有一個(gè)請(qǐng)求
4粮彤、請(qǐng)求轉(zhuǎn)發(fā)時(shí)根穷,數(shù)據(jù)可以共享(request對(duì)象共享)
request作用域
?設(shè)置request域?qū)ο?/p>
?request.setAttribute("限域變量名","域變量的值");
? 獲取指定域?qū)ο蟮闹?/p>
? ?request.getAttribute("限域變量名");
? 移除指定域?qū)ο蟮闹?/p>
? ?request.removeAttribute("限域變量名");
設(shè)置在request作用域中的數(shù)據(jù)可以實(shí)現(xiàn)數(shù)據(jù)共享,但只在一次請(qǐng)求中有效导坟,即只在請(qǐng)求轉(zhuǎn)發(fā)跳轉(zhuǎn)有效屿良。
HttpServletResponse
常用方法
?添加響應(yīng)頭
resp.addHeader("userName", "zhangsan");
?判斷響應(yīng)頭是否被設(shè)置
System.out.println(resp.containsHeader("userName"));
System.out.println(resp.containsHeader("userPwd"));
設(shè)置錯(cuò)誤狀態(tài)碼
?resp.sendError(404);
?resp.sendError(404,"由于顏值過低,無法訪問惫周!");
?設(shè)置自動(dòng)刷新
?resp.setHeader("refresh", "2"); // 每?jī)擅胨⑿乱淮?/p>
?設(shè)置固定時(shí)間后跳轉(zhuǎn)到某頁面
resp.setHeader("refresh", "3;URL=http://www.baidu.com"); // 3秒鐘后跳轉(zhuǎn)到百度
響應(yīng)數(shù)據(jù)
?1尘惧、輸出字符流
PrintWriter writer = response.getWriter();
?輸出字符串
?2、輸出字節(jié)流
?ServletOutputStream out = response.getOutputStream();
?輸出任意
? 注意:字符流和字節(jié)流不能同時(shí)使用
? ?java.lang.IllegalStateException: getWriter() has already been called for this response
響應(yīng)類型
?response.setContentType("響應(yīng)類型MIME-TYPE");
?text文本格式:text/plain
?html格式:text/html
響應(yīng)亂碼解決
getWriter()的字符亂碼
對(duì)于 getWriter()獲取到的字符流递递,響應(yīng)中文必定出亂碼喷橙。
由于服務(wù)器端在進(jìn)行編碼時(shí)默認(rèn)會(huì)使用 ISO-8859-1 格式的編碼,該編碼方式并不支持中文漾狼。
getOutputStream()字節(jié)亂碼
對(duì)于 getOutputStream()方式獲取到的字節(jié)流重慢,響應(yīng)中文時(shí),由于本身就是傳輸?shù)淖止?jié)逊躁, 所以此時(shí)可能出現(xiàn)亂碼似踱,也可能正確顯示。
當(dāng)服務(wù)器端給的字節(jié)恰好和客戶端使用的編碼方式一致時(shí)則文本正確顯示,否則出現(xiàn)亂碼核芽。
解決方案:
第一步:設(shè)置服務(wù)端的響應(yīng)編碼格式
response.setCharacterEncoding("UTF-8");
第二步:設(shè)置客戶端的編碼的格式
response.setHeader("content-type","text/html;charset=UTF-8");
總結(jié):
保證發(fā)送端和接收端的編碼一致囚戚;設(shè)置客戶端和服務(wù)端的編碼保持一致,且都支持中文轧简。
同時(shí)設(shè)置客戶端和服務(wù)端的編碼
response.setContentType("text/html;charset=utf-8");
響應(yīng)圖片
設(shè)置響應(yīng)類型
resp.setContentType("image/jpeg");
?getRealPath():得到項(xiàng)目存放在服務(wù)器中位置
String realPath = req.getServletContext().getRealPath("/");
System.out.println(realPath);
?得到圖片存放的路徑?
String filePath = realPath + "/WEB-INF/jay.jpg"; 得到file文件對(duì)象
File file = new File(filePath);
?得到輸出字節(jié)流
ServletOutputStream out = resp.getOutputStream();
?得到文件的輸入流
InputStream in = new FileInputStream(file);
?輸出數(shù)據(jù)
byte[] bytes = new byte[1024];
int len = 0;
while((len=in.read(bytes)) != -1) {
輸出
out.write(bytes, 0, len);
}
刷出流
out.flush();
關(guān)閉流
in.close();
out.close();
重定向
?一種跳轉(zhuǎn)方式驰坊,是一種由服務(wù)端指導(dǎo),客戶端的跳轉(zhuǎn)行為哮独。
流程:當(dāng)有請(qǐng)求到達(dá)服務(wù)器時(shí)拳芙,服務(wù)器接收請(qǐng)求,響應(yīng)給客戶端時(shí)會(huì)向客戶端響應(yīng)一個(gè)新的地址皮璧,客戶端接收到響應(yīng)后舟扎,會(huì)立刻馬上重新發(fā)起一次請(qǐng)求到新的地址,服務(wù)器再接收并接收悴务。
?特點(diǎn):
1睹限、客戶端跳轉(zhuǎn)
2、存在兩次請(qǐng)求
?3讯檐、地址欄會(huì)發(fā)生改變
?4羡疗、數(shù)據(jù)不共享(request對(duì)象不共享)
?請(qǐng)求轉(zhuǎn)發(fā)與重定向的區(qū)別
?1、請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)端跳轉(zhuǎn)别洪,重定向是客戶端跳轉(zhuǎn)
?2叨恨、請(qǐng)求轉(zhuǎn)發(fā)時(shí)地址欄不發(fā)生改變,重定向時(shí)地址欄發(fā)生改變
?3挖垛、請(qǐng)求轉(zhuǎn)發(fā)時(shí)從始至終只有一次請(qǐng)求特碳,重定向時(shí)存在兩次請(qǐng)求
?4、請(qǐng)求轉(zhuǎn)發(fā)時(shí)數(shù)據(jù)可以共享(request對(duì)象和域?qū)ο螅┰位唬囟ㄏ驎r(shí)數(shù)據(jù)不共享
?5、請(qǐng)求轉(zhuǎn)發(fā)時(shí)地址只能定位到當(dāng)前站點(diǎn)下(不能跨域)站宗,重定向時(shí)地址可以是任意地址
請(qǐng)求路徑問題
?相對(duì)路徑
?相對(duì)于當(dāng)前資源所在的路徑
?絕對(duì)路徑
1闸准、以http://開頭的路徑,已經(jīng)跨域梢灭,可以定位到任意地址
?2夷家、以/開頭
?如果是服務(wù)端跳轉(zhuǎn),"/"代表的含義是? http://IP:端口/站點(diǎn)名/
?如果是客戶端跳轉(zhuǎn)敏释,"/"代表的含義是? http://IP:端口/
Cookie對(duì)象
Cookie
?客戶端的緩存技術(shù)库快,瀏覽器技術(shù)。
?作用: 提高網(wǎng)頁效率钥顽,減輕服務(wù)器負(fù)載义屏。
?一、Cookie的創(chuàng)建和發(fā)送
?Cookie的創(chuàng)建:
?Cookie cookie = new Cookie("名稱","值");
?Cookie的發(fā)送:
?response.addCookie(cookie);
Cookie對(duì)象的獲取
返回是cookie數(shù)組
?獲取cookie數(shù)組
Cookie[] cookies = request.getCookies();
判斷非空
if (cookies != null && cookies.length >0) {
遍歷cookie數(shù)組
for (Cookie cookie : cookies) {
System.out.println("名稱:" + cookie.getName() + ",值:" + cookie.getValue());
獲取uname的名稱
if ("uname".equals(cookie.getName())) {
System.out.println("name的值為:" + cookie.getValue());
}
}
}
Cookie到期時(shí)間的設(shè)定
到期時(shí)間闽铐,到期時(shí)間用來指定該 cookie 何時(shí)失效蝶怔。默認(rèn)為當(dāng)前瀏覽器關(guān)閉即失效。
?通過 setMaxAge(int time);方法設(shè)定 cookie 的最大有效時(shí)間兄墅,以秒為單位踢星。
?大于0的整數(shù)
?表示cookie存活指定秒數(shù)
在瀏覽器中存活指定秒數(shù),在時(shí)間未到之前隙咸,cookie會(huì)一直存在沐悦,無論是關(guān)閉瀏覽器還是關(guān)閉電腦,都不影響五督。但是不跨瀏覽器和電腦藏否。
?小于0的整數(shù)
?表示不存儲(chǔ),默認(rèn)關(guān)閉瀏覽器失效
?0
?表示刪除