• Servlet【方法使用】


    🍎一.HttpServlet

    Servlet是属于上层建筑,它处在应用层,它的下层有传输层,网络层,数据链路层,硬件,属于“经济基础”,毕竟下层经济基础决定上层建筑。前面说过,Servlet是一组操作HTTP的API,Tomcat可作为HTTP服务器来处理请求,这个处理请求的关键就是调用Servlet来操作HTTP给客户端做出响应
    在这里插入图片描述

    🍉1.1HttpServlet方法

    方法名称调用时机
    initHttpServlet 实例化之后被调用一次
    destoryHttpServlet 实例化之后被调用一次
    service收到 HTTP 请求的时候调用
    doGet收到 GET 请求的时候调用(由 service 方法调用)
    doPost收到 POST 请求的时候调用(由 service 方法调用)
    doPut/doDelete/doOptions/…收到其他请求的时候调用(由 service 方法调用)

    我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service .
    在这里插入图片描述
    注意: HttpServlet 的实例只是在程序启动时创建一次. 而不是每次收到 HTTP 请求都重新创建实例.

    🍉1.2HttpServlet 代码示例: 处理 POST 请求

    在webapp目录下创建一个HTML文件,用来构造POST请求,首先我们先的引入jquery依赖,你可以如果网络地址:jquery依赖地址导入依赖,或者直接复制https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js,然后调用ajax构造请求

    @WebServlet("/Servlet")
    public class MethodServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //引入resp.setContentType("text/html; charset=utf-8")后浏览器就会遵循utf-8就不会出现乱码了
           // resp.setContentType("text/html; charset=utf-8");
            resp.getWriter().write("POST 响应");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    我们发现与我们的预期不一致,我们处理请求的时候返回了POST请求,而这里显示了POST??,原因是发生了乱码,idea默认编码格式为utf-8,Windows默认的编码格式是gbk,那浏览器解析body的时候也是以gbk格式去进行解析,要想统一格式,就得先告诉浏览器响应数据的编码格式是什么,我们需要在Servlet程序里面设置字符格式,设置方法为调用HttpServletResponse对象的setContentType方法,传入参数text/html; charset=utf-8
    在这里插入图片描述
    我们也可以通过Fiddler抓包来看到Post方法响应
    在这里插入图片描述

    🍎二. HttpServletResquest

    🍉2.1 HttpServletResquest方法

    核心方法

    方法描述
    String getProtocol()返回请求协议的名称和版本
    String getProtocol()返回请求协议的名称和版本。
    String getMethod()返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
    String getRequestURI()从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
    String getContextPath()返回指示请求上下文的请求 URI 部分。
    String getQueryString()返回包含在路径后的请求 URL 中的查询字符串。
    Enumeration getParameterNames()返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
    String getParameter(Stringname)以字符串形式返回请求参数的值,或者如果参数不存在则返回null。
    String[] getParameterValues(Stringname)返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
    Enumerationget HeaderNames()返回一个枚举,包含在该请求中包含的所有的头名。
    String getHeader(Stringname)以字符串形式返回指定的请求头的值。
    String getCharacterEncoding()返回请求主体中使用的字符编码的名称。
    String getContentType()返回请求主体的 MIME 类型,如果不知道类型则返回 null。
    int getContentLength()以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。
    InputStream getInputStream()用于读取请求的 body 内容. 返回一个 InputStream 对象.

    🍉2.2获取GET请求信息

    @WebServlet("/ShowServlet")
    public class ShowRequest extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            StringBuilder stringBuilder = new StringBuilder();
            resp.setContentType("text/html; charset=utf-8");
            stringBuilder.append("

    首行

    "
    ); //1协议名称与版本 stringBuilder.append("协议版本:"); stringBuilder.append(req.getProtocol()); stringBuilder.append("
    "
    ); //2方法类型 stringBuilder.append("方法:"); stringBuilder.append(req.getMethod()); stringBuilder.append("
    "
    ); //3获取查URL路径 stringBuilder.append("URL路径:"); stringBuilder.append(req.getRequestURI()); stringBuilder.append("
    "
    ); //4URL(不包括查询字符串后面的部分) stringBuilder.append("URL(不包括查询字符串后面的部分):"); stringBuilder.append(req.getRequestURL()); stringBuilder.append("
    "
    ); //5一级路径 stringBuilder.append("一级路径:"); stringBuilder.append(req.getContextPath()); stringBuilder.append("
    "
    ); //6查询字符串 stringBuilder.append("查询字符串:"); stringBuilder.append(req.getQueryString()); stringBuilder.append("
    "
    ); //7正文编码格式 stringBuilder.append("正文编码格式:"); stringBuilder.append(req.getCharacterEncoding()); stringBuilder.append("
    "
    ); //8mine stringBuilder.append("mine:"); stringBuilder.append(req.getContentType()); stringBuilder.append("
    "
    ); //9正文长度 stringBuilder.append("正文长度:"); stringBuilder.append(req.getContentLength()); stringBuilder.append("
    "
    ); //10获得头部的键值 stringBuilder.append("

    获得头部的键值:

    "
    ); Enumeration header = req.getHeaderNames(); while(header.hasMoreElements()) { String key = (String)header.nextElement(); stringBuilder.append(key); stringBuilder.append(":"); stringBuilder.append(req.getHeader(key)); stringBuilder.append("
    "
    ); } resp.getWriter().write(stringBuilder.toString()); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这里插入图片描述
    Fiddler抓包
    在这里插入图片描述

    🍉2.3获取POST响应信息

    我们知道post请求的请求信息在http格式中的body部分当中,而body中的请求内容的格式是有很多种的,比如最常见的有:

    x-www-form-urlencode格式,通过form表单或者postman构造。

    json格式
    form-data格式
    x-www-form-urlencode格式:
    
    • 1
    • 2
    • 3
    k e y = v a l u e & k e y = v a l u e & . . . key=value\&key=value\&...key=value&key=value&...
    
    • 1

    form表单创建x-www-form-urlencode格式请求:

    <!DOCTYPE html>
    <html lang="ch">
    <head>
        <meta charset="UTF-8">
        <title>post</title>
    </head>
    <body>
    <form action="./PostParameter" method="post" accept-charset="utf-8">
        <span>userId</span>
        <input type="text" name="userId">
        <span>classId</span>
        <input type="text" name="classId">
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    class User{
        int classId;
        int userId;
    }
    @WebServlet("/PostParameter")
    public class PostParameterServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取post请求body请求中的参数
            //设置请求与响应编码格式
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html; charset=utf8");
    
            String userId = req.getParameter("userId");
            String classId = req.getParameter("classId");
            //写会数据
            resp.getWriter().write("userId=" + userId + ", " + "classId=" + classId);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述
    点击就会在POST方法的body得到输入的结果
    在这里插入图片描述

    🍎三. HttpServletRespont

    🍉3.1 HttpServletRespont方法

    核心方法

    方法描述
    void setStatus(int sc)为该响应设置状态码
    void setHeader(String name,String value)设置一个带有给定的名称和值的 header. 如果 name 已经存在,则覆盖旧的值.
    void addHeader(Stringname, String value)添加一个带有给定的名称和值的 header. 如果 name 已经存在,不覆盖旧的值, 并列添加新的键值对
    void setContentType(Stringtype)设置被发送到客户端的响应的内容类型。
    void setCharacterEncoding(Stringcharset)设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
    void sendRedirect(Stringlocation)使用指定的重定向位置 URL 发送临时重定向响应到客户端。
    PrintWriter getWriter()用于往 body 中写入文本格式数据.
    OutputStream getOutputStream()用于往 body 中写入二进制格式数据.

    注意: 响应对象是服务器要返回给浏览器的内容, 这里的重要信息都是程序猿设置的. 因此上面的方法都是 “写” 方法.
    注意: 对于状态码/响应头的设置要放到 getWriter / getOutputStream 之前. 否则可能设置失效.

    🍉3.2响应的构造

    代码示例:一.设置状态码

    @WebServlet("/status")
    public class StatusServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //格式
            resp.setContentType("text/html; charset=utf8");
            //设置状态码
            int status = 200;
            resp.setStatus(status);
    
            resp.getWriter().write("这是" + status + "状态码的响应内容!");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    代码示例:二. 自动刷新

    @WebServlet("/autoRefreshServlet")
    public class AutoRefreshServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //格式
            resp.setContentType("text/html; charset = utf8");
            //设置Refresh,第二个参数表示刷新频率,单位是秒
            resp.setHeader("Refresh", "1");
            //响应
            resp.getWriter().write("时间戳:" + System.currentTimeMillis());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
    代码示例:三. 重定向

      @WebServlet("/redirect")
        public class RedirectServlet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //格式
                resp.setContentType("text/html; charset = utf8");
                //设置状态码
                resp.setStatus(302);
                //设置重定向字段与地址,如跳转到我的码云
                resp.setHeader("Location", "https://gitee.com/panjiapeng");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Keepalived
    关于各种PLMN的选择
    一文带你快速上手MySQL8窗口函数,实现更高效的数据处理
    python编程“常识”【pip安装路径、计算、pycharm中的terminal运行前面的PS修改成自己环境】
    vulfocus靶场tomcat-cve_2017_12615 文件上传
    2022/9/25 考试总结
    什么是On-die Termination(ODT,片上端接)
    windows上传文件到linux的方法
    MSP430F149用模拟SPI和FM25CL640通信
    有人说考个PMP证两个星期搞定?
  • 原文地址:https://blog.csdn.net/m0_59735420/article/details/127779216