• Servlet的请求和响应



    提示:以下是本篇文章正文内容,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>
        
        <form method="get" action="/get-req">
            <input type="text" name="username">
            <input type="text" name="password">
            <button>提交button>
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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 + "|");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    回到目录…

    接收 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>
        
        <form method="post" action="/post-req">
            <input type="text" name="username">
            <input type="text" name="password">
            <button>提交button>
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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 + "|");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    回到目录…

    二、发送响应

    针对 GET 请求,发出响应

    通过URL + 回车键 向浏览器发送 GET 请求

    http://127.0.0.1:8080/get-res
    
    • 1

    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.setContentType("text/css; charset=utf-8");
            PrintWriter writer = resp.getWriter();
            writer.print("你好中国");
    //        // 3-2. 响应体的内容是字节流
    //        OutputStream outputStream = resp.getOutputStream();
    //        outputStream.write('H');
    //        outputStream.write('e');
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    回到目录…

    针对 POST 请求,发出响应

    通过 send-post2.html 的 form 表单将 post 请求发送给 Servlet

    DOCTYPE html>
    <html lang="zh-hans">
    <head>
        <meta charset="UTF-8">
        <title>发送 HTTP POST 请求title>
    head>
    <body>
        
        <form method="post" action="/post-res">
            <input type="text" name="username">
            <input type="text" name="password">
            <button>提交button>
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    控制台结果:

    username=Wangshaoyu&password=123456
    
    • 1

    回到目录…

    三、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 表单)
    GETPOST
    请求体GET 不应该带有请求体POST可以带有请求体
    请求参数GET请求放在查询字符串query string中POST 请求放在查询字符串或请求体中(form 表单)
    后退 / 刷新无害数据会被重新提交(浏览器应该告知用户数据会被重新提交)
    书签可收藏为书签不可收藏为书签
    缓存(为了提高访问速度)能被缓存不能缓存
    编码类型application/x-www-form-urlencodedapplication/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如何做出响应。之后的学习内容将持续更新!!!

  • 相关阅读:
    终端准入控制系统,保障企业内网安全的关键防线
    mtbatisplus
    32、Flink table api和SQL 之用户自定义 Sources & Sinks实现及详细示例
    JAVA-GUI工具的编写-----事件篇
    数据库缓存一致性研究
    从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置
    C#多线程的操作
    一本通1080;余数相同问题
    asp毕业设计——基于asp+access的校园网物品交易平台设计与实现(毕业论文+程序源码)——校园网物品交易平台
    协同过滤算法
  • 原文地址:https://blog.csdn.net/qq15035899256/article/details/126342176