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获取请求消息