Request和Response原理
- TomCat根據請求url當中的資源路徑創建對應的servlet類
- TomCat會創建request對象和response對象,request對象當中封裝請求消息數據
- TomCat將Request和Response兩個對象傳遞給service方法,並且調用service方法
- 我們可以來操作request和response兩個對象,request獲取請求消息數據,response獲取響應消息數據
- 服務器再給瀏覽器做出響應之前,會從response對象中獲取程序員設置的響應消息數據
Request的體系結構
ServletRequest:接口
||繼承
\/
HttpServletRequest:接口
||實現
\/
RequestFacade:實現類
Request功能
獲取請求消息數據
獲取請求行數據
GET /day/demo?name=zhangsan HTTP/1.1
String getMethod();
String getContextPath();
String getServletPath();
String getQueryString();
String getRequestURI();/day/demo
StringBuffer getRequestURL();http://localhost/day/demo
String getProtocol();
String getRemoteAddr();
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "*.demo")
public class RequestDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getMethod());
System.out.println(request.getContextPath());
System.out.println(request.getServletPath());
System.out.println(request.getQueryString());
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
System.out.println(request.getProtocol());
System.out.println(request.getRemoteAddr());
}
}
GET
/servlet
/cjd.demo
username=627715324%40qq.com
/servlet/cjd.demo
http://localhost/servlet/cjd.demo
HTTP/1.1
0:0:0:0:0:0:0:1
獲取請求頭數據
String getHeader(String var1);
Enumeration<String> getHeaderNames(String var1);
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(urlPatterns = "*.demo")
public class RequestDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> stringEnumeration = request.getHeaderNames();
while(stringEnumeration.hasMoreElements()) {
String header = stringEnumeration.nextElement();
System.out.println(header + " : " + request.getHeader(header));
}
}
}
host : localhost
connection : keep-alive
upgrade-insecure-requests : 1
user-agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4023.0 Safari/537.36 Edg/81.0.396.0
accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site : same-origin
sec-fetch-mode : navigate
sec-fetch-user : ?1
sec-fetch-dest : document
referer : http://localhost/servlet/login.html
accept-encoding : gzip, deflate, br
accept-language : en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
獲取請求體數據
ServletInputStream getInputStream() throws IOException;
BufferedReader getReader() throws IOException;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>註冊頁面</title>
</head>
<body>
<form action="/servlet/do.demo" method="POST">
<input type="text" placeholder="請輸入用戶名" name="username"><br>
<input type="text" placeholder="請輸入密碼" name="password"><br>
<input type="submit" value="註冊">
</form>
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.Buffer;
@WebServlet(urlPatterns = {"*.demo"})
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedReader bufferedReader = req.getReader();
String line = null;
while((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
}
username=chinese&password=china
其他功能
獲取請求參數通用方式:GET和POST都可以
String getParameter(String var1);
String[] getParameterValues(String var1);
Enumeration<String> getParameterNames();
Map<String, String[]> getParameterMap();
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Enumeration<String> parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()) {
String element = parameterNames.nextElement();
System.out.println(element + " : " + req.getParameter(element));
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, String[]> map = req.getParameterMap();
for(Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] values = entry.getValue();
System.out.println(key + " : ");
for(String s : values) {
System.out.println(s);
}
}
}
request.setCharacterEncoding("utf-8");
請求轉發
RequestDispatcher getRequestDispatcher(String var1);
req.getRequestDispatcher("/servlet/cjd.demo2").forward(req, resp);
- 特點
1.瀏覽器的地址欄不發生變化
2.只能訪問當前服務器內部資源當中,不能訪問服務器外部的其他資源
3.轉發是一次請求,也就是多個資源使用的是同一個請求
共享數據
- 域對象:一個有作用範圍的對象,可以在範圍之內共享數據
- request的域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據
- 方法
void setAttribute(String var1, Object var2);
Object getAttribute(String var1);
void removeAttribute(String var1);
獲取ServletContext
- ServletContext getServletContext();
Request獲取請求消息