文章目录
提示:以下是本篇文章正文内容,Java系列学习将会持续更新
一、接收请求
接收 GET 请求
当接收到GET请求时,请求参数放在 URL 的 query string 中,格式是name =value&passwd=value
send-get.html 发送GET请求
<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>发送 HTTP POST 请求</title>
</head>
<body>
<!-- method: 声明是 post请求,action: url 地址,服务器接收表单数据的地址 -->
<form method="get" action="/get-req">
<input type="text" name="username">
<input type="text" name="password">
<button>提交</button>
</form>
</body>
</html>
Servlet 获取到GET请求,并将请求信息打印到控制台
@WebServlet("/get-req")
public class GetRequestService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("|" + username + "|");
System.out.println("|" + password + "|");
}
}
接收 POST 请求
当接收POST请求时,请求参数可以放在URL的query string中,也可以放在request body中(必须form表单提交),格式都是name =value&passwd=value
send-post.html 发送POST请求
<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>发送 HTTP POST 请求</title>
</head>
<body>
<!-- method: 声明是 post请求,action: url 地址,服务器接收表单数据的地址 -->
<form method="post" action="/post-req">
<input type="text" name="username">
<input type="text" name="password">
<button>提交</button>
</form>
</body>
</html>
Servlet 获取到POST请求,并将请求信息打印到控制台
@WebServlet("/post-req")
public class PostRequestService extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("|" + username + "|");
System.out.println("|" + password + "|");
}
}
二、发送响应
针对 GET 请求,发出响应
通过URL + 回车键 向浏览器发送 GET 请求
http://127.0.0.1:8080/get-res
Servlet发出响应,将字符串打印在浏览器上
@WebServlet("/get-res")
public class GetResponseService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 设置响应状态
resp.setStatus(202);
// 2. 设置响应头(header),可以不设置响应头
// 2-1. 标准响应头,比如 Content-Type(PS:Content-Length 不需要我们设置)
resp.setHeader("Content-Type", "text/css; charset=uft-8");
// // 2-2. 非标准响应头,填什么都可以(中文不行)
// resp.setHeader("X-My-Class", "Java19");
// 3. 设置响应体的内容
// 3-1. 响应体的内容是字符(使用较多的)
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/plain");
// 打印内容到页面
PrintWriter writer = resp.getWriter();
writer.print("你好中国");
// // 3-2. 响应体的内容是字节流
// OutputStream outputStream = resp.getOutputStream();
// outputStream.write('H');
// outputStream.write('e');
}
}
针对 POST 请求,发出响应
通过 send-post2.html 的 form 表单将 post 请求发送给 Servlet
<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>发送 HTTP POST 请求</title>
</head>
<body>
<!-- method: 声明是 post请求,action: url 地址,服务器接收表单数据的地址 -->
<form method="post" action="/post-res">
<input type="text" name="username">
<input type="text" name="password">
<button>提交</button>
</form>
</body>
</html>
Servlet发出响应,将请求内容打印在控制台上
@WebServlet("/post-res")
public class PostResponseService extends HttpServlet {
// 重写了 doPost 方法,所以我们这个资源支持了 POST 方法,但不支持 GET 请求
// 不能直接在浏览器里直接输入这个 URL 回车,会看到 405 的
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream inputStream = req.getInputStream();
byte[] buf = new byte[1024];
int n = inputStream.read(buf);
// byte[] -> String 字符集解码
String reqBody = new String(buf, 0, n, "UTF-8");
System.out.println(reqBody);
// BufferedReader reader = req.getReader();
// char[] buf = new char[1024];
// int n = reader.read(buf); // n 单位是字符
// String reqBody = new String(buf, 0, n);
// System.out.println(reqBody);
}
}
控制台结果:
username=Wangshaoyu&password=123456
三、Servlet生命周期
三个阶段,执行三种方法:
阶段 | 执行的方法 | 执行次数 |
---|---|---|
1. 初始化阶段 | init(…); | 仅执行一次 |
2. 处理请求-响应阶段 | service(req, resp); | 每次请求-响应都会执行一次,HttpServlet 变成 doGet / doPost … |
3. 销毁阶段 | destroy(); | 仅执行一次,在tomcat服务器停止的时候 |
四、面试题:GET 和POST 的区别
根本区别只有一个: 就是语义不同: GET代表是获取的语义; POST 代表的是提交的语义。
具体表现上有很多不同 :
- 标准中规定: GET 不应该带有请求体; POST可以带有请求体。
- 有请求参数的话,GET请求放在查询字符串query string中,POST 请求放在查询字符串或请求体中(form 表单)
GET | POST | |
---|---|---|
请求体 | GET 不应该带有请求体 | POST可以带有请求体 |
请求参数 | GET请求放在查询字符串query string中 | POST 请求放在查询字符串或请求体中(form 表单) |
后退 / 刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存(为了提高访问速度) | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data。为二进制数据使用多重编码 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据时, URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! |
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是JavaWeb的学习,学习了Servlet的请求和响应,如何向Servlet发送GET请求和POST请求,并且Servlet如何做出响应。之后的学习内容将持续更新!!!
本文含有隐藏内容,请 开通VIP 后查看