- response:是Servlet里一塊區域,可以通過人為修改之后由tomcatMS引擎重新寫入Http
- request :經過tomcatMS引擎封裝的http請求體信息

二、HttpServletResponse的使用名詞說明:
- 什么是http響應
響應行
響應頭
響應體 - 可以設置的一些參數
響應行中:可以設置狀態碼setStatus(int) //200 302 304 404 500
res.setStatus(500);
響應體頭中: - 設置時間:
格式:
addDateHeader(String name,long value);//添加新的參數
setDateHeader(String name,long value);//修改原有參數
例子:
res.addDateHeader("timer", new Date().getTime());
- 設置文本
格式:
addHeader(String name,String value);//添加新的參數
setHeader(String name,String value);//修改原有參數
例子:
res.addHeader("name", "abc");
- 設置數字
格式:
addIntHeader(String name,int value);//添加新的參數
setIntHeader(String name,int value);//修改原有參數
例子:
res.addIntHeader("unmber", 123);
注意:setHeader和addHeader的區別?
setHeader如果有同名的覆蓋 addHeader追加頭信息
響應體:服務端向前端頁面回寫數據
格式:
PrintWriter writer = response.getWriter();//字符流
ServletOutputStream out = response.getOutputStream();//字節流
例子:
//設定字符編碼解碼方式
res.setContentType("text/html; charset=UTF-8");
String str="你好 中國";
//獲得Servlet的Response輸出流
PrintWriter writer = res.getWriter();
//寫出數據到內存
writer.println(str);
- response的案例
- 重定向(狀態碼302)
技術實現:302+location
302:狀態碼 代表中定向的狀態碼
location:頭信息 代表跳轉的頭信息
//設置重定向狀態碼
res.setStatus(302);
//設置重定向訪問路徑
res.setHeader("location", "/Demo6/servlet2");
注意:重定向的特點?
(1) 客戶端訪問服務端兩次
(2) 地址欄的地址變化了
在實際的開發我們實現重定向不用此方式
response為我們直接提供了一個重定向的方法sendRedirect("url");
例子:
//設置重定向狀態碼
res.setStatus(302);
//設置重定向訪問路徑
res.sendRedirect("/Demo6/servlet2");
- 定時跳轉
通過refresh的頭可以實現定時跳轉(此方法不需要設置重定向狀態碼)
res.setHeader("refresh", "5;url=/Demo6/servlet2");
注意:定時跳轉的特點?
(1) 客戶端訪問服務端兩次 但是有時間的拖延
(2) 地址欄的地址變化了
- 緩存機制:代表緩存的狀態碼是304
- last-modified:出現在響應頭中,代表服務器文件最有一次修改的時間|
- if-modified-since:出現在請求頭中,代表本地緩存中的服務器文件最后一次修改的時間。
- 狀態碼是304拿緩存
設置緩存資源的生命周期:
expires頭:代表緩存 代表資源緩存的時間
res.addDateHeader("expires", new Date().getTime()+1*60*1000);//設置這個web資源的緩存時間是1分鍾
- 向頁面輸入內容
如果向頁面輸出中文 會導致亂碼 切值都是?????
問題:亂碼是在客戶端還是服務端亂的啊?服務端 是在寫到response緩沖區的時候亂碼的
response緩沖區本身有內置的編碼格式:iso-8859-1
要想使服務端寫入中文 客戶端正常顯示中文 - 設置response的編碼格式utf-8
res.setCharacterEncoding("UTF-8");
- 設置指導瀏覽器解碼的方式
方式一:
writer.write(" <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");
res.setContentType("text/html; charset=UTF-8");
方式三:
response.setHeader("content-type", "text/html;charset=UTF-8");
注意:下面2種方式是經常使用的方式,會覆蓋方式一的設置,也會覆蓋對response編碼格式的設置。 - getOutputStream() 文件下載
- 什么時候需要文件下載?瀏覽器不識別的文件需要下載
- 什么文件需要編寫文件下載的代碼?瀏覽器識別的需要編寫文件下載的代碼
注意:如果文件需要客戶端進行下載 需要兩個頭:
Content-Disposition:告知瀏覽器文件以附件形式打開
Content-Type:告知瀏覽器文件的MIME類型
實現代碼:
html頁面:
<a href="/Demo6/servlet3?filename=1.bmp">圖片資源</a>
Servlet后台:
//獲取請求中的filename參數
String filename=request.getParameter("filename");
//設置告訴瀏覽器是下載文件的參數
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//設置下載文件的擴展名
response.setContentType(this.getServletContext().getMimeType(filename));
//獲取對應下載文件的路徑
String path=this.getServletContext().getRealPath("/resouce/1.bmp");
//設置讀取流讀取文件
BufferedInputStream bufs=new BufferedInputStream(new FileInputStream(path));
//獲取response的輸出流
ServletOutputStream out = response.getOutputStream();
//一般讀取寫出流程
byte []b=new byte[1024];
int len=-1;
while((len=bufs.read(b))!=-1)
{
out.write(b, 0, len);
}
//關閉流資源,也可以不寫。tomcat服務器會自動關流
bufs.close();
out.close();
- 驗證碼
html頁面:
<img id="verify" alt="" src="/Demo6/servlet4" onclick="fn()">
<a href="javascript:void(0);" onclick="fn()">看不清 點擊刷新</a>
<script type="text/javascript">
function fn()
{//如果每次提交的頁面路徑都相同者服務默認會任務是相同資源不會從新獲取,所以提交的時候帶上一個時間來欺騙服務器,達到每次都進行重新獲取
document.getElementById("verify").src = "/Demo6/servlet4?timestamp="+ new Date().getTime();
}
</script>
Serlvet頁面:
OutputStream out = response.getOutputStream();
VerifyCodeUtils.finalOutputImage(out);
工具類中finalOutPutImage方法源碼:
public static String finalOutputImage(OutputStream out) throws IOException{
String verifyCode = generateVerifyCode(5).toLowerCase();
int w = 300;
int h = 90;
outputImage(w,h,out,verifyCode);
return verifyCode;
}
- response的注意事項
- 通過response獲得流資源不必手動關閉 tomcat服務器會幫助你關閉
- getWriter()與getOutputStream()方法不能共存