JavaWeb總結(四),javaweb總結
使用Servlet發送伺服器端響應資訊
Servlet API中定義一個專門的介面類javax.servlet.http.HttpServletResponse用於建立HTTP響應,包括HTTP協議的狀態行、回應標頭以及訊息體;
HTTP響應樣本
設定響應狀態行
- 狀態行分為HTTP協議、狀態代碼和狀態原因三個部分
- 狀態原因與狀態代碼直接相關
- HTTP協議由伺服器確定
- 通過設定狀態代碼來實現許多重要功能(可以把使用者重新導向到另一個網站,可以指示附加的文檔是圖片、PDF或HTML……)
HTTP狀態代碼:
100-199:表示資訊性代碼,標示用戶端應該採取的其他動作,請求進行中。
200-299:表示客戶請求成功。
300-399:表示用於已經移走的資源檔,指示新的地址。
400-499:表示由用戶端引發的錯誤。
500-599:表示由伺服器端引發的錯誤。
設定狀態代碼
- 使用HttpServletResponse的setStatus()方法
//setStatus方法的參數是一個整數 //使用HttpServletResponse中的常量setStatus(HttpServletResponse.SC_NOT_FOUND );
- 設定狀態碼返回描述資訊
response設定狀態代碼為404
未找到檔案web伺服器返回404應答
HTTP的響應資訊是由狀態行、回應標頭、空行和訊息體(內容文檔)按照次序組成並以流的方式向瀏覽器發送的。
HTTP響應資訊按次序組成並向瀏覽器發送資料流
提示:在Servlet規範中沒有規定Servlet必須緩衝訊息體,因而要在使用PrintWriter輸出訊息體前設定狀態代碼。 |
HttpServletResponse為兩種常見的情形提供了專用的方法:
- sendError方法
public void sendError(int code,String message)
該方法產生一個404應答,同時產生一個簡短的HTML錯誤資訊文檔發生給客戶。
response.sendError(404,"路徑錯誤");
sendError結果
-sendRedirect方法
Public void sendRedirect(String url)
該方法產生一個302應答,同時在Location頭中指示新文檔的URL路徑(類似a標籤跳轉效果,會產生兩次請求和響應)。
設定回應標頭
HttpServletResponse對象用於操縱響應的HTTP頭
- containsHeader(String name):返回一個布爾值,指示是否設定了指定的回應標頭。
- setHeader(String name,String value):用一個給定的名稱和字串設定回應標頭的通用方式。如果回應標頭已經被設定,新的值將覆蓋當前的值。在設定值之前可以用containsHeader判斷頭是否存在;
- setIntHeader(String name,int value):用一個給定的名稱和整型值設定回應標頭。如果回應標頭已經被設定,新的值將覆蓋當前的值。在設定值之前可以用containsHeader判斷頭是否存在;
- setDateHeader(String name,long date): 用一個給定的名稱和日期值設定回應標頭。這裡的日期值應該是反映自1970-1-1日(GMT)以來的精確到毫秒的長整型。如果回應標頭已經被設定,新的值將覆蓋當前的值。在設定值之前可以用containsHeader判斷頭是否存在;
- addHeader(String name,String value):在response中添加一個給定名稱和字串值的回應標頭,而不管是否已經存放在同名的回應標頭。該方法允許回應標頭有多個值。
- addIntHeader(String name,intvalue):在response中添加一個給定名稱和整型值的回應標頭。該方法允許回應標頭有多個值。
- addDateHeader(String name,long value):在response中添加一個給定名稱和日期值設定回應標頭。這裡的日期值應該是反映自1970-1-1日(GMT)以來的精確到毫秒的長整型。該方法允許回應標頭有多個值。
- setContentType(String mimeType):用於設定返回給用戶端內容內容的MIME類型。
- addCookie(Cookie cookie):用於向set-Cookie插入一個Cookie。由於在HTTP響應中會存在多個Set-Cookie行,所以沒有對應的setCookie方法。
目的用於告訴用戶端
- 發送回來的內容的類型
- 有多少內容正被發送
- 發送內容的伺服器的類型
設定響應訊息體
- HttpServletResponse對象負責將資訊返回給用戶端
- HttpServletResponse對象只產生一個空的HTTP響應
- 傳回自訂的內容需要使用getWriter()或者getOutputStream()方法
- getWriter()傳送普通文本
- getOutputStream()傳送二進位內容
傳遞文字資料流
getWriter()方法用於得到一個輸出資料流
PrintWriter out = response.getWriter();//與寫HTML一樣,不過需要println和print方法去拼字out.println("<html>");out.println("<head>");out.println("<title>Hello World!</title>”);out.println("</html>");out.println("</head>");
傳遞二進位流
getOutputStream()方法可以對發送到用戶端的資訊進行更多控制
該方法返回javax.servlet. ServletOutputStream對象
ServletOutputStream允許開發人員寫原始位元組
OutputStream比使用PrinterWriter發送文本效率更高
可以動態地建立任何形式的數字內容
package com.java.downLoad;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DownLaod
*/
public class DownLaod extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//擷取檔案名稱字
String filename = request.getParameter("filename");
//設定檔案MIME類型
ServletContext sc = this.getServletContext();
response.setContentType(sc.getMimeType(filename));
//設定Content-Disposition,名字為目前時間毫秒數
InputStream fiels = null;
response.setHeader("Content-Disposition", "attachment;filename="+System.currentTimeMillis());
//擷取檔案並且轉化為流
fiels = sc.getResourceAsStream("/downLoad/"+filename);
//傳輸串流
ServletOutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int length = 0;
while((length=fiels.read(buf))!=-1){
out.write(buf, 0 ,length);
}
//關閉流
if(out!=null){
out.close();
out.flush();
}
if(fiels!=null){
fiels.close();
}
}
}
佈建要求重新導向
- 可以選擇別的伺服器端程式來處理請求
- 把請求重新導向到一個完全不同的URL上
重新導向原理
瀏覽器發送HTTP請求
Servlet把302響應碼和Location回應標頭發送給用戶端和瀏覽器
瀏覽器根據Location頭中新的URL重新發出HTTP請求
設定自動重新整理和等待頁
- 在指定時間內自動重新整理當前頁或到一個新的頁面
- 根據時間來控制響應
- 想在響應中有一個短時間的暫停
response.setHeader("Refresh", "time; URL=url" );