Java Web之請求和響應


  Servlet最主要作用就是處理客戶端請求並作出回應,為此,針對每次請求,Web容器在調用service()之前都會創建兩個對象,分別是HttpServletRequest和HttpServletResponse。其中HttpServletRequest封裝HTTP請求消息,HttpServletResponse封裝HTTP響應消息。需要注意的是,Web服務器運行過程中,每個Servlet都會只創建一個實例對象,不過每次請求都會調用Servlet實例的service(ServletRequest req, ServletResponse res)方法,這里HttpServletRequest是ServletRequest的子類,HttpServletResponse是ServletResponse的子類。

  HttpServletRequest和HttpServletResponse接口繼承關系圖如下所示:

 1、HttpServletResponse

  HttpServletResponse接口繼承自ServletResponse接口,由於HTTP響應消息分為狀態行、響應消息體、消息體三部分,因此,在HttpServletResponse接口中定義了向客戶端發送響應狀態碼、響應消息頭、響應消息體的方法。雖然HttpServletResponse接口中的方法較多,但是我們常用的也就是那么幾個,如果用到其他的方法了可以閱讀響應的源碼或者相關資料就行了。

發送狀態碼相關函數

方法 說明
public void setStatus(int sc) 設置響應消息狀態碼,Web服務器默認產生一個狀態碼為200的狀態行
public void sendError(int sc) 發送表示錯誤信息的狀態碼,第二個方法還增加了一個用於提示說明的文本信息
public void sendError(int sc, String msg)

發送響應消息頭相關函數

方法 說明
public void addHeader(String name, String value) 設置HTTP響應頭字段,name指定字段名稱,value指定字段值。addHeader可以增加同名的響應頭字段,setHeader則會覆蓋同名的頭字段
public void setHeader(String name, String value)
public void setContentLength(int len)  設置響應消息的實體內容的大小,單位為字節,即設置Content-Length字段的值
public void setContentType(String type) 設置Servlet輸出內容的MIME類型,即設置Content-Type字段的值 
public void setCharacterEncoding(String charset) 設置輸出內容字符編碼,即設置Content-Type字段的值,注意,該方法優先級比setContentType的高
public void sendRedirect(String location) Servlet請求重定向

發送響應消息體相關函數

方法 說明
public ServletOutputStream getOutputStream() 獲取HttpServletResponse的字節輸出流ServletOutputStram類型
public PrintWriter getWriter() 獲取HttpServletResponse的字符輸出流ServletWriter類型

中文輸出亂碼問題

  計算機中的數據都是以二進制形式存儲的,因此,傳輸文本時,就會發生字符的字節之間的轉換。字符與字節之間的轉換時通過查碼表完成的,字符轉換為字節的過程稱為編碼,字節轉換為字符的過程稱為解碼,如果編碼和解碼使用的碼表不一樣,則會出現亂碼問題。

  注意:HttpServletResponse對象的字符輸出流在編碼時,默認采用的是ISO 8859-1編碼,該編碼方式不兼容中文,比如會將"中國"編碼為"63 63"(在ISO 8959-1的碼表中查不到的字符會顯示63)。當瀏覽器對接收到的數據進行解碼時,會默認采用GB2312,將"63"解碼為"?",瀏覽器就將"中國"兩個字符解碼為"??"。

HttpServletResponse程序示例

package zzz;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 設置響應消息編碼,注釋后"中國"會顯示"??"亂碼
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        out.println("hello 中國");
    }
    
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }
}

  有時會遇到定時跳轉頁面的問題,HTTP中Refresh頭字段可以通知瀏覽器在指定的時間內自動刷新並跳轉到其他頁面,網頁定時刷新並跳轉到指定頁面。

package zzz;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 設置響應消息編碼
        response.setContentType("text/html;charset=utf-8");
        response.setHeader("Refresh", "2;url=http://www.baidu.com");
        PrintWriter out = response.getWriter();

        out.println("hello 中國,2秒后跳轉到百度...");
    }
    
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }
}
View Code

 2、HttpServletRequest

  HttpServletRequest接口繼承ServletRequest接口,專門用於封狀HTTP請求消息。由於HTTP請求信息包括請求行、請求頭和請求體三部分, 所以HttpServletRequest接口定義了獲取請求行、請求頭和請求體的相關方法。

獲取請求行的相關方法

方法 說明
public String getMethod() 獲取HTTP請求方式,POST、GET等
public String getRequestURI() 獲取請求行中資源名稱部分
public String getQueryString() 獲取請求行中的參數部分
public String getProtocol() 獲取請求行中協議名稱和版本,如HTTP 1.1
public String getContextPath() 獲取請求URL中屬於Web應用程序的路徑

  其實關於請求行的方法從方法名中就可以看出其作用,這里就不一一貼出來了。

獲取請求消息頭的相關方法

方法 說明
public String getHeader(String name) 獲取指定字段的值,如果沒有返回null,如果有多個返回第一個值
public Enumeration<String> getHeaders(String name) 返回一個指定字段的Enumeration集合對象
public Enumeration<String> getHeaderNames() 返回一個包含所有字段的Enumeration集合對象
public String getContentType() 獲取Content-Type字段的值

打印請求消息頭字段的所有值

package zzz;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 設置響應消息編碼
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        Enumeration<String> names = request.getHeaderNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String value = request.getHeader(name);
            out.println(name + ": " + value + "</br>");
        }
    }
    
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }
}
View Code

獲取請求體的相關方法

方法 說明
public ServletInputStream getInputStream() 獲取請求的ServletInputStream對象,如果實體內容為非文本,只能通過getInputStream方法獲取請求體消息體
public BufferedReader getReader() 獲取請求的BufferedReader對象,該對象會將實體內容字節數據轉換為指定字符集編碼的文本字符串

獲取請求參數

方法 說明
public String getParameter(String name) 獲取指定的參數值,沒有該參數返回null
public Enumeration<String> getParameterNames() 返回一個包含所有參數名的Enumeration對象
public String[] getParameterValues(String name) HTTP請求中可能有多個相同的參數,獲取同一個參數名對應的所有參數值

  獲取請求參數實例見:http://www.cnblogs.com/xdp-gacl/p/3798347.html

 3、RequestDispatcher接口

  當一個Web資源受到客戶端請求后,如果希望服務器通知另外一個資源如處理請求,除了使用功能sendRedirect()實現重定向外,還可以通過RequestDispatcher接口的實例對象來實現,在ServletRequest接口中定義了一個獲取RequestDispatcher對象的方法--getRequestDispatcher(String path),它返回某個路徑所指定資源的RequestDispatcher對象,參數path必須以"/"開頭,用於表示當前Web應用的根目錄,也就是path路徑必須是在本Web程序中,否則會出現異常。

RequestDispatcher接口中方法

方法 功能
public void forward(ServletRequest request, ServletResponse response) 將一個Servlet傳遞給另外一個Web資源,將請求傳遞給其他資源進行響應
public void include(ServletRequest request, ServletResponse response) 用於將其他資源作為當前響應內容包含進來

4、參考資料

  1、javaweb學習總結(十)——HttpServletRequest對象(一)

  2、Java Web之Servlet技術


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM