zoukankan      html  css  js  c++  java
  • 9.17JavaWeb之HttpServletRequest接口

    9.17JavaWeb之HttpServletRequest接口

    HttpServletRequest请求对象的产生

    概念:

    浏览器--->Http协议--->服务器--->Servlet处理

    处理流程图:

     

    当 Servlet 容器将响应信息返回给客户端后,HttpServletRequest 对象和 HttpServletReponse 对象被销毁

    HttpServletRequest的主要作用:

    获取请求信息

    HttpServletRequest接口当中的方法

    一个完整的Http请求包括:

    • 请求行

    • 请求消息头

    • 请求体

    什么是HttpServletRequest请求:

    • 在 Servlet API 中,定义了一个 HttpServletRequest 接口,它继承自 ServletRequest 接口。

    • HttpServletRequest 对象专门用于封装 HTTP 请求消息,简称 request 对象。

    接口当中的这些方法也是为了分别获取Http请求的结构部分的:

    • 获取请求行

    • 获取消息头

    • 获取 form 表单的数据


    获取请求行信息

    一个完整的Http请求请求行包括:

    请求方法、请求资源名、请求路径等信息

    返回值类型方法声明描述
    String getMethod() 该方法用于获取 HTTP 请求方式(如 GET、POST 等)。
    String getRequestURI() 该方法用于获取请求行中的资源名称部分,即位于 URL 的主机和端口之后,参数部分之前的部分。
    String getQueryString() 该方法用于获取请求行中的参数部分,也就是 URL 中“?”以后的所有内容。
    String getContextPath() 返回当前 Servlet 所在的应用的名字(上下文)。对于默认(ROOT)上下文中的 Servlet,此方法返回空字符串""。
    String getServletPath() 该方法用于获取 Servlet 所映射的路径。
    String getRemoteAddr() 该方法用于获取客户端的 IP 地址。
    String getRemoteHost() 该方法用于获取客户端的完整主机名,如果无法解析出客户机的完整主机名,则该方法将会返回客户端的 IP 地址。

    示例代码:

    package com.example.HttpServletRequestDemo;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;

    /**
    * 这是一个模拟HttpServletRequest获取请求行
    * @since JDK 1.8
    * @date 2021/09/17
    * @author Lucifer
    */
    @WebServlet(name = "RequestLine", value = "/RequestLine")
    public class RequestLine extends HttpServlet {
       //定义UID
       private static final long serialVersionUID = 1L;

       //Get方法
       @Override
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
           //设置响应字符集
           response.setContentType("text/html;charset=UTF-8");
           //创建对象往控制台写内容
           PrintWriter writer = response.getWriter();
           //开始写内容
           writer.println(
                   "请求方式:" + request.getMethod() + "</br>" //important
                   + "客户端IP地址:" + request.getRemoteAddr() + "</br>"
                   + "应用名字(上下文):" + request.getContextPath() + "</br>"
                   + "URI:" + request.getRequestURI() + "<br/>" //important
                   + "请求字符串:" + request.getQueryString() + "<br/>"
                   + "Servlet所映射的路径:" + request.getServletPath() + "<br/>" //important
                   + "客户端的完整主机名:" + request.getRemoteHost() + "<br/>"
          );
      }

       //Post
       @Override
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
           doGet(request, response);
      }
    }

    获取请求头

    HttpServletRequest接口定义了一系列用于获取Http请求头字段的方法:

    返回值类型方法声明描述
    String getHeader(String name) 该方法用于获取一个指定头字段的值。 如果请求消息中包含多个指定名称的头字段,则该方法返回其中第一个头字段的值。
    Enumeration getHeaders(String name) 该方法返回指定头字段的所有值的枚举集合, 在多数情况下,一个头字段名在请求消息中只出现一次,但有时可能会出现多次。
    Enumeration getHeaderNames() 该方法返回请求头中所有头字段的枚举集合。
    String getContentType() 该方法用于获取 Content-Type 头字段的值。
    int getContentLength() 该方法用于获取 Content-Length 头字段的值 。
    String getCharacterEncoding() 该方法用于返回请求消息的字符集编码 。

    示例代码:

    package com.example.HttpServletRequestDemo;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;

    /**
    * 定义接收请求头方法的Servlet类,用于处理Http请求头当中的一些数据
    * @since JDK 1.8
    * @date 2021/09/17
    * @author Lucifer
    */
    @WebServlet(name = "RequestHeader", value = "/RequestHeader")
    public class RequestHeader extends HttpServlet {
       //设置UID
       private static final long serialVersionUID = 1L;

       //Get请求
       @Override
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
           //定义响应字符集
           response.setContentType("text/html;charset=UTF-8");
           //打印内容到控制台
           PrintWriter writer = response.getWriter();
           //获取请求头字段的枚举集合--->这是一个带了泛型的接口
           Enumeration<String> headers = request.getHeaderNames();
           //循环判断
           while (headers.hasMoreElements()){
               //请求头字段的值
               String value = request.getHeader(headers.nextElement());
               //将内容写到控制台
               writer.write(headers.nextElement() + ":" + value + "<br />");
          }
      }

       //Post
       @Override
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           doGet(request, response);
      }
    }

    获取form表单的数据

    对于Post请求,请求内容是放在Body当中的。为了方便获取表单中的请求参数,ServletRequest 定义了一系列获取请求参数的方法

    方法示例:

    返回值类型方法声明功能描述
    String getParameter(String name) 返回指定参数名的参数值。
    String [ ] getParameterValues (String name) 以字符串数组的形式返回指定参数名的所有参数值(HTTP 请求中可以有多个相同参数名的参数)。
    Enumeration getParameterNames() 以枚举集合的形式返回请求中所有参数名。
    Map getParameterMap() 用于将请求中的所有参数名和参数值装入一个 Map 对象中返回。

    示例代码:

    form表单

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>This is a Practice</title>
    </head>
    <body>
     <form action="/HttpServletRequestDemo_war_exploded/RequestParam" method="post">
       <table border="1" width="80%">
         <tr>
           <td colspan="2" align="center">练习使用</td>
         </tr>
         <tr>
           <td>Name:</td>
           <td><input type="text" name="username" /></td>
         </tr>
         <tr>
           <td>Password:</td>
           <td><input type="password" name="password" /></td>
         </tr>
         <tr>
           <td>Sex:</td>
           <td>
             <input type="radio" name="sex" value="male" />Boy
             <input type="radio" name="sex" value="female" />Girl
           </td>
         </tr>
         <tr>
           <td>Choose Language:</td>
           <td>
             <input type="checkbox" name="language" value="Java" />Java
             <input type="checkbox" name="language" value="Go" />Go
             <input type="checkbox" name="language" value="C" />C
           </td>
         </tr>
         <tr>
           <td>Choose city:</td>
           <td>
             <select name="city">
               <option value="none">---PleaseChoose---</option>
               <option value="LiuZhou">LiuZhou</option>
               <option value="NanNing">NanNing</option>
               <option value="GuiLin">GuiLin</option>
             </select>
           </td>
         </tr>
         <tr>
           <td colspan="2">
             <input type="submit" value="Pull" />
           </td>
         </tr>
       </table>
     </form>
    </body>
    </html>

    Servlet处理类:

    package com.example.HttpServletRequestDemo;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Arrays;

    /**
    * 创建获取表单信息的Servlet容器类,用于接收表单的信息并输出到控制台
    * @since JDK 1.8
    * @date 2021/09/17
    * @author Lucifer
    */
    @WebServlet(name = "RequestParam", value = "/RequestParam")
    public class RequestParam extends HttpServlet {
       //设置UID
       private static final long serialVersionUID = 1L;

       //Get
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //super.doGet(req, resp);--->不要重写这个构造器,否则会报405
           //设置响应字符集
           resp.setContentType("text/html;charset=UTF-8");
           PrintWriter writer = resp.getWriter();
           // 获取内容,做其他操作
           //修改request缓冲区的字符集为UTF-8
           req.setCharacterEncoding("utf-8");
           // 获取姓名
           String username = req.getParameter("username");
           // 获取密码
           String password = req.getParameter("password");
           // 获取性别
           String sex = req.getParameter("sex");
           // 获取城市
           String city = req.getParameter("city");
           // 获取语言
           String[] languages = req.getParameterValues("language");
           writer.write(
           "用户名:" + username + "<br/>"
               + "密码:" + password + "<br/>"
               + "性别:" + sex + "<br/>"
               + "城市:" + city + "<br/>"
               + "使用过的语言:" + Arrays.toString(languages) + "<br/>"
          );
      }

       //Post
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doGet(req, resp);
      }
    }
    中文乱码问题
    • Get

    • Post


    Get

    Tomcat8以后不会出现这个问题

    Post

    成因:

    • POST 提交的数据在请求体中,其所使用的编码格式时页面一致(即 utf-8)。

    • request 对象接收到数据之后,会将数据放到 request 缓冲区,缓冲区的默认字符集是 ISO-8859-1(该字符集不支持中文),两者使用的字符集不一致导致乱码。

    解决办法:

    • 在获取请求参数之前设置 request 缓冲区字符集为 utf-8

    //修改request缓冲区的字符集为UTF-8
    req.setCharacterEncoding("utf-8");
    // 获取姓名
    String username = req.getParameter("username");

     

    It's a lonely road!!!
  • 相关阅读:
    bzoj3796
    bzoj2186
    bzoj3769
    bzoj2660
    bzoj2245
    bzoj2916
    bzoj1261
    在IDEA中以TDD的方式对String类和Arrays类进行学习
    2018-2019-2 实验二《Java面向对象程序设计》实验报告
    《Java程序设计》第 6 周学习总结
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15308476.html
Copyright © 2011-2022 走看看