• Servlet之HttpServletRequest


    概述:

    1、HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。
    2、HttpServletRequest接口实现类由Http服务器负责提供。
    3、HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息。
    4、开发人员习惯于将HttpServletRequest接口修饰的对象称为请求对象。

    作用:

    1、可以读取Http请求协议包中请求行信息。
    2、可以读取保存在Http请求协议包中请求头或者请求体中请求参数信息。
    3、可以代替浏览器向Http服务器申请资源文件调用。

    代码示例

    1、可以读取Http请求协议包中请求行信息。

    package com.zyh.contrller;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class OneServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
            //1、通过请求对象,读取请求行中的URL信息
            /*StringBuffer sb =  request.getRequestURL();
            String url = sb.toString();*/
            //合并
            String url =  request.getRequestURL().toString();
            //2、通过请求对象,读取请求行中的method信息
            String method = request.getMethod();
            //3、通过请求对象,读取请求行中的URI信息
            /*
            * URI:资源文件精准定位地址。
            * 在请求行并没有URI这个属性,
            * 实际上是从URL中截取的一个字符串。
            *
            * URI用于:
            * 让Http服务器对被访问的资源文件进行定位。
            */
            String uri =  request.getRequestURI();
            System.out.println("URL:" + url);
            System.out.println("Method:" + method);
            System.out.println("URI:" + uri);
        }
    }
    

    在这里插入图片描述
    2、可以读取保存在Http请求协议包中请求头或者请求体中请求参数信息。
    2.1

    package com.zyh.contrller;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.Enumeration;
    
    public class TwoServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1、通过请求对象获得请求头中的所有的请求参数名
            //将所有的请求参数名称保存到一个枚举对象进行返回
            Enumeration paramNames = request.getParameterNames();
            //遍历枚举
            while (paramNames.hasMoreElements()){
                String paramName = (String) paramNames.nextElement();
                //2、通过请求对象读取指定的请求参数的值
                String value = request.getParameter(paramName);
                System.out.println("请求参数名:" + paramName + " 请求参数值:" + value);
            }
        }
    }
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <center>
            <a href="/qwer/two?userName=aa&password=123">
                通过超链接访问TwoServlet并携带请求参数
            </a>
        </center>
    </body>
    </html>
    

    在这里插入图片描述
    点击链接:
    在这里插入图片描述
    2.2

    package com.zyh.contrller;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class ThreeServlet extends HttpServlet {
    
        /*
        * 问题:
        * 1、GET方式发送中文参数内容时,得到正常结果;
        * 2、以POST方式发送中文参数内容时,得到乱码。
        *
        * 原因:
        * 1、浏览器以GET方式发送请求,请求参数保存在【请求头】,
        * 在Http请求协议包到达Http服务器之后,
        * 请求头二进制内容由Tomcat负责解码,
        * Tomcat9.0默认使用[utf-8]字符集,可以解释一切国家文字。
        *
        * 2、浏览器以POST方式发送请求,请求参数保存在【请求体],
        * 在Http请求协议包到达Http服务器之后,
        * 请求体二进制内容由当前请求对象(request)负责解码。
        * request默认使用[IS0-8859-1]字符集,
        * 此时如果请求体参数内容是中文,将无法解码只能得到乱码。
        * */
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        	//通知请求对象,使用UTF-8字符集对请求体的内容进行一次重新解码
            request.setCharacterEncoding("UTF-8");
            //通过请求对象,读取【请求体】参数
            String value = request.getParameter("userName");
            System.out.println("从请求体得到参数值:" + value);
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //通过请求对象,读取【请求头】参数
            String userName = request.getParameter("userName");
            System.out.println("从请求头得到参数值:" + userName);
        }
    }
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>three</title>
    </head>
    <body>
        <center>
            <form action="/qwer/three" method="get">
                请求参数:<input type="text" name="userName" /><br/>
                <input type="submit" value="get方式访问ThreeServlet">
            </form>
    
            <form action="/qwer/three" method="post">
                请求参数:<input type="text" name="userName" /><br/>
                <input type="submit" value="post方式访问ThreeServlet">
            </form>
        </center>
    </body>
    </html>
    

    设置字符集前,post请求的乱码情况:
    在这里插入图片描述
    在这里插入图片描述
    重新设置字符集后:
    在这里插入图片描述

  • 相关阅读:
    获取本地地址,获取上传文件的后缀
    foreach
    es6入门
    jquery-ui 拖拽排序
    移动端常用
    vue父子组件通信
    Weinre(pc调试手机页面)
    Ztree的使用
    jquery on() 转
    c++ 基本使用
  • 原文地址:https://www.cnblogs.com/yu011/p/13740823.html
Copyright © 2020-2023  润新知