博主名称一鸣 个人专栏: 《苍穹外卖》《喜喜》⛺️生活的理想就是为了理想的生活!文章目录今日实验目标老师划的重点一、先搞懂HTTP 请求到底分几块二、RequestDemo1获取请求行 请求头2.1 在 myServlet 包下新建 RequestDemo12.2 完整代码直接抄2.3 启动服务器浏览器访问2.4 请求头拿到浏览器版本三、RequestDemo2获取请求体POST 才有⚠️ 一个重要的坑3.1 整体思路3.2 第一步在 web 目录下新建 register.html3.3 第二步新建 RequestDemo2在 doPost 里读请求体3.4 启动服务器访问测试四、今日 API 速查表建议截图保存五、今日踩坑提醒老师反复强调六、写在最后哈喽各位小伙伴今天是我学 JavaWeb 的第 N 天跟着老师把Request 对象从头到尾捋了一遍。这玩意儿说简单也简单说坑也真坑——GET 没请求体、POST 中文乱码、URI 和 URL 傻傻分不清楚……这篇文章把我今天上课敲的所有代码、控制台截图、老师强调的重点全给你们整理出来了看完直接能跑建议先收藏再看今日实验目标老师划的重点序号目标是否重点1学会通过继承HttpServlet创建自己的 Servlet 类⭐2知道doGet和doPost方法什么时候被调用⭐⭐3知道如何在 Servlet 中获取 HTTP 请求参数、如何向用户发回响应⭐⭐4解决请求和响应中的中文乱码问题⭐⭐⭐ 重点/难点5知道如何把表单提交给一个 Servlet 处理⭐⭐6知道如何在HttpServlet子类中获取ServletContext对象⭐本次实验不用新建工程直接在已经创建好的servletApp工程里搞就行。一、先搞懂HTTP 请求到底分几块浏览器给服务器发请求本质上就是发了一坨文本。这坨文本一共分三部分┌─────────────────────────────────────────────┐ │ ① 请求行 (Request Line) │ ← GET /servletApp/RequestDemo1 HTTP/1.1 ├─────────────────────────────────────────────┤ │ ② 请求头 (Request Headers) │ ← User-Agent、Host、Accept... ├─────────────────────────────────────────────┤ │ ③ 请求体 (Request Body) │ ← 只有 POST 才有GET 没有 │ usernamexppassword123 │ └─────────────────────────────────────────────┘而HttpServletRequest对象就是 Tomcat 把这坨文本封装好塞给你的一个 Java 对象——你想拿什么调对应的方法就行。二、RequestDemo1获取请求行 请求头2.1 在 myServlet 包下新建 RequestDemo1操作步骤在myServlet文件夹上右键 → New → Servlet类名输入RequestDemo1父类选HttpServlet其他默认2.2 完整代码直接抄packagemyServlet;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;/** * 使用 Request 获取请求行数据GET 方式 * HttpServletRequest 对象用于封装客户端的请求信息 */WebServlet(/RequestDemo1)publicclassRequestDemo1extendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{System.out.println(访问 RequestDemo1);// 1. 获取请求行中的请求方法例如 GET 或 POSTStringmethodreq.getMethod();System.out.println(Request Method: method);// 2. 获取虚拟目录项目访问路径在 Tomcat 里设置例如 /servletAppStringcontextPathreq.getContextPath();System.out.println(Context Path: contextPath);// 3. 获取 Servlet 路径/RequestDemo1StringservletPathreq.getServletPath();System.out.println(Servlet Path: servletPath);// 4. 获取请求行中的参数GET 方式?usernamezhangsanStringqueryStringreq.getQueryString();System.out.println(Query String: queryString);// 5. 获取请求 URL统一资源定位符// http://localhost:8080/servletApp/RequestDemo1StringrequestURLreq.getRequestURL().toString();System.out.println(Request URL: requestURL);// 6. 获取请求 URI统一资源标识符/servletApp/RequestDemo1StringrequestURIreq.getRequestURI();System.out.println(Request URI: requestURI);// 7. 获取请求头 user-agent浏览器的版本信息Stringagentreq.getHeader(user-agent);System.out.println(agent);}OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{doGet(req,resp);}}代码截图长这样就是老师上课敲的版本2.3 启动服务器浏览器访问在浏览器地址栏输入http://localhost:8080/servletApp/RequestDemo1?usernamezhangsan控制台输出结果我们来对着结果一行行读Request Method: GET ← 我是 GET 请求 Context Path: /servletApp ← 项目的虚拟目录 Servlet Path: /RequestDemo1 ← 我这个 Servlet 的路径 Request URL: http://localhost:8080/servletApp/RequestDemo1 ← 完整 URL Request URI: /servletApp/RequestDemo1 ← URI没有协议和主机 Query String: usernamezhangsan ← 问号后面那一串URL 和 URI 的区别面试必问URL 协议 主机 端口 路径能定位到一台具体的服务器资源URI 路径部分不包含协议、主机、端口范围更大一句话URL 是 URI 的子集能当网址点的那个就是 URL。2.4 请求头拿到浏览器版本// 获取请求头 user-agent浏览器的版本信息Stringagentreq.getHeader(user-agent);System.out.println(agent);重启服务后控制台会打印出类似这一串Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36这玩意儿有啥用可以用来判断用户用的是 Chrome、Edge 还是手机浏览器然后给不同的页面做适配。三、RequestDemo2获取请求体POST 才有⚠️ 一个重要的坑GET 请求是没有请求体的参数直接拼在 URL 后面就是getQueryString()拿到的那串。想拿请求体必须把请求方式改成POST。3.1 整体思路准备一个 HTML 页面里面放一个form表单用来发 POST 请求在 Servlet 的doPost方法里获取请求体数据用request.getReader()或者request.getInputStream()读出来启动服务器访问测试。3.2 第一步在 web 目录下新建 register.html路径WebContent/register.html或者 Maven 工程里的webapp/register.html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8title注册页面/title/headbody!-- action: form 表单提交的请求地址 method: 请求方式指定为 post --formaction/servletApp/RequestDemo2methodpostinputtypetextnameusernameinputtypepasswordnamepasswordinputtypesubmit/form/body/html 划重点action里写的是Servlet 的访问路径要跟WebServlet里的一模一样methodpost一定要写不写默认就是 GET每个 input 的name属性就是后端拿到的参数名。3.3 第二步新建 RequestDemo2在 doPost 里读请求体packagemyServlet;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.BufferedReader;importjava.io.IOException;/** * 使用 Request 获取请求体数据 * HttpServletRequest 对象用于封装客户端的请求信息 */WebServlet(/RequestDemo2)publicclassRequestDemo2extendsHttpServlet{OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// 获取 post 请求体请求参数// 1. 获取字符输入流BufferedReaderbrrequest.getReader();// 2. 读取数据Stringlinebr.readLine();System.out.println(line);}OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);}}![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlimages%2Fimage4.pngpos_idimg-N3tjipwk 为什么用getReader()而不是getInputStream()getReader()拿字符流适合读文本比如表单提交的usernamexppassword123getInputStream()拿字节流适合读文件上传这种二进制数据。我们现在传的是纯文本所以用getReader()就够了。3.4 启动服务器访问测试浏览器打开http://localhost:8080/servletApp/register.html在表单里随便输入比如用户名xp、密码123点提交。控制台就会打印出usernamexppassword123这就是请求体的原始模样——一行字符串分隔多个参数连接键值。四、今日 API 速查表建议截图保存方法作用示例返回值req.getMethod()获取请求方式GET/POSTreq.getContextPath()获取虚拟目录项目路径/servletAppreq.getServletPath()获取 Servlet 路径/RequestDemo1req.getQueryString()获取 GET 请求参数串usernamezhangsanreq.getRequestURL()获取完整 URLStringBufferhttp://localhost:8080/servletApp/RequestDemo1req.getRequestURI()获取 URI不含协议主机/servletApp/RequestDemo1req.getHeader(User-Agent)获取指定请求头浏览器版本字符串req.getReader()获取字符输入流读请求体BufferedReaderreq.getInputStream()获取字节输入流读文件等ServletInputStream五、今日踩坑提醒老师反复强调GET 没有请求体getReader()/getInputStream()只能在 POST 里用getRequestURL()返回的是StringBuffer想打印一定要.toString()getQueryString()在没有参数时返回null不是空字符串判空要注意中文乱码是重难点POST 提交中文参数时记得在doPost第一行加request.setCharacterEncoding(UTF-8);否则控制台拿到的可能是一坨???表单的action路径写错404 找不到 Servlet检查一下是不是少写了虚拟目录/servletApp。六、写在最后今天这节课其实就是一句话浏览器发过来的所有东西Tomcat 都封装进了request对象你想拿啥就调啥方法。请求行 →getMethod / getContextPath / getRequestURI / getQueryString请求头 →getHeader(xxx)请求体 →getReader() / getInputStream()POST 专属下节课老师要讲请求参数的通用获取方式getParameter、getParameterMap还有请求转发和响应重定向咱们到时候继续肝如果这篇文章帮到你了麻烦点赞 收藏 关注走一波咱们下节课见 标签JavaWebServletHttpServletRequestRequestJava后端学习笔记乱码