在Servlet API中,定義了一個HttpServletRequest接口,它繼承自ServletReauest接口,專門用來封裝HTTP請求消息。由於HTTP請求消息分爲請求行、請求消息頭和請求消息體三部分,因此,在HttpServletRequest接口中定義了獲取請求行、請求頭和請求消息體的相關方法。
我們在創建Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲代表請求的request和代表響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大,今天我們學習HttpServletRequest。
當訪問Servlet時,會在請求消息的請求行中,包含請求方法、請求資源名、請求路徑等信息,爲了獲取這些信息,在HTTPServletRequest接口中,定義了一系列用於獲取請求行的方法,如下表:
示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//獲取請求行的相關信息
out.println("getMethod:" + request.getMethod() + "<br/>");
out.println("getQueryString:" + request.getQueryString() + "<br/>");
out.println("getProtocol:" + request.getProtocol() + "<br/>");
out.println("getContextPath" + request.getContextPath() + "<br/>");
out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
out.println("getServletPath:" + request.getServletPath() + "<br/>");
out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
out.println("getLocalName:" + request.getLocalName() + "<br/>");
out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
out.println("getServerName:" + request.getServerName() + "<br/>");
out.println("getServerPort:" + request.getServerPort() + "<br/>");
out.println("getScheme:" + request.getScheme() + "<br/>");
out.println("getRequestURL:" + request.getRequestURL() + "<br/>");
通過request獲得請求頭
當請求Servlet時,需要通過請求頭向服務器傳遞附加信息,例如,客戶端可以接收的數據類型,壓縮方式,語言等。爲此,在HttpServletRequest接口中,定義了一系列用於獲取HTTP請求頭字段的方法,如下表:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//獲取請求頭信息
Enumeration headerNames = request.getHeaderNames();
//使用循環遍歷請求頭,並通過getHeader()方法獲取一個指定名稱的頭字段
while (headerNames.hasMoreElements()){
String headerName = (String) headerNames.nextElement();
out.println(headerName + " : " + request.getHeader(headerName) + "<br/>");
}
}
通過request獲得請求體(請求參數)
在實際開發中,經常需要獲取用戶提交的表單數據,例如,用戶名,密碼、電子郵件等,爲了方便獲取表單中的請求參數,在HttpServletRequest接口總,定義了一些列獲取請求參數的方法,如下表所示:
示例:
創建一個帶有表單的jsp頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表單</title>
</head>
<body>
<form action="/JavaEEDemo/request" method="post">
用戶名:<input type="text" name="username"><br/>
密 碼:<input type="password" name="password"><br/>
愛 好:
<input type="checkbox" name="hobby" value="sing">唱歌
<input type="checkbox" name="hobby" value="dance">跳舞
<input type="checkbox" name="hobby" value="football">足球
<input type="submit" value="提交">
</form>
</body>
</html>
編寫Servlet的doPost方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用戶名:" + username);
System.out.println("密碼:" + password);
//獲取參數名爲hobby的值
String[] hobbys = request.getParameterValues("hobby");
System.out.println("愛好:");
for (int i = 0; i < hobbys.length; i++) {
System.out.println(hobbys[i] + ", ");
}
}