Servlet的请求和响应

发布于:2023-01-17 ⋅ 阅读:(448) ⋅ 点赞:(0)


提示:以下是本篇文章正文内容,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 代表的是提交的语义。

具体表现上有很多不同 :

  1. 标准中规定: GET 不应该带有请求体; POST可以带有请求体。
  2. 有请求参数的话,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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到