• HttpServletRequest 类


    HttpServletRequest类有什么作用

    每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
    然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
    信息。

    HttpServletRequest 类的常用方法

    方法 作用
    getRequestURI() 获取请求的资源路径
    getRequestURL() 获取请求的统一资源定位符(绝对路径)
    getRemoteHost() 获取客户端的 ip 地址
    getHeader() 获取请求头
    getParameter() 获取请求的参数
    getParameterValues() 获取请求的参数(多个值的时候使用)
    getMethod() 获取请求的方式 GET 或 POST
    setAttribute(key, value) 设置域数据
    getAttribute(key) 获取域数据
    getRequestDispatcher() 获取请求转发对象

    常用 API 示例代码:

    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 RequestAPIServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
            // i.getRequestURI() 获取请求的资源路径
            System.out.println("URI => " + req.getRequestURI());
            // ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
            System.out.println("URL => " + req.getRequestURL());
            // iii.getRemoteHost() 获取客户端的 ip 地址
    /**
     * 在 IDEA 中,使用 localhost 访问时,得到的客户端 ip 地址是--> 127.0.0.1
     * 在 IDEA 中,使用 127.0.0.1 访问时,得到的客户端 ip 地址是 -->127.0.0.1
     * 在 IDEA 中,使用 真实 ip 访问时,得到的客户端 ip 地址是 --> 真实的客户端 ip 地址
     */
            System.out.println("客户端 ip 地址 => " + req.getRemoteHost());
            // iv.getHeader() 获取请求头
            System.out.println(" 请求头 User-Agent ==>> " + req.getHeader("User-Agent"));
            // vii.getMethod() 获取请求的方式 GET 或 POST
            System.out.println( "请求的方式 ==>> " + req.getMethod() );
        }
    }
    

    xml文件配置:

        <servlet>
            <servlet-name>RequestAPIServletservlet-name>
            <servlet-class>com.kailong.servlet.RequestAPIServletservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>RequestAPIServletservlet-name>
            <url-pattern>/requestAPIServleturl-pattern>
        servlet-mapping>
    

    浏览器访问:http://127.0.0.1:8080/Test/requestAPIServlet
    结果:

    注:若访问http://localhost:8080/Test/requestAPIServlet有可能出现ip地址是0:0:0:0:0:0:0:1,0:0:0:0:0:0:0:1是属于ipv6
    解决方法:
    最有效的方式就是改变请求的ip,不要使用localhost:8080
    使用127.0.0.1:8080或者ip:8080。

    如何获取请求参数

    表单:

    <body>
    <form action="http://localhost:8080/Test/parameterServlet" method="get">
      用户名:<input type="text" name="username"><br/>
      密码:<input type="password" name="password"><br/>
      兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
      <input type="checkbox" name="hobby" value="java">Java
      <input type="checkbox" name="hobby" value="js">JavaScript<br/>
      <input type="submit">
    form>
    body>
    

    Java 代码:

    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.Arrays;
    public class ParameterServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
    // 获取请求参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String[] hobby = req.getParameterValues("hobby");
            System.out.println(" 用户名:" + username);
            System.out.println(" 密码:" + password);
            System.out.println(" 兴趣爱好:" + Arrays.asList(hobby));
        }
    }
    

    xml文件配置同上。

    测试数据如图:
    点击提交后查看服务器结果:

    doGet 请求的中文乱码解决:

    // 获取请求参数
    String username = req.getParameter("username");
    //1 先以 iso8859-1 进行编码
    //2 再以 utf-8 进行解码
    username = new String(username.getBytes("iso-8859-1"), "UTF-8");
    

    POST 请求的中文乱码解决

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
    IOException {
    // 设置请求体的字符集为 UTF-8 ,从而解决 post 请求的中文乱码问题
    req.setCharacterEncoding("UTF-8");
    System.out.println("-------------doPost------------");
    // 获取请求参数
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] hobby = req.getParameterValues("hobby");
    System.out.println(" 用户名:" + username);
    System.out.println(" 密码:" + password);
    System.out.println(" 兴趣爱好:" + Arrays.asList(hobby));
    }
    

    请求的转发

    什么是请求的转发?
    请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。

    Servlet1 代码:

    public class Servlet1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
    // 获取请求的参数(办事的材料)查看
            String username = req.getParameter("username");
            System.out.println("在 Servlet1 (柜台 1 )中查看参数(材料):" + username);
    // 给材料 盖一个章,并传递到 Servlet2 (柜台 2 )去查看
            req.setAttribute("key1"," 柜台 1 的章");
    // 问路: Servlet2 (柜台 2 )怎么走
    /**
     * 请求转发必须要以斜杠打头, / 斜杠表示地址为: http://ip:port/ 工程名 / , 映射到 IDEA 代码的 web 目录
     
    * */
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2"); requestDispatcher.forward(req,resp); } }

    Servlet2 代码:

    public class Servlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
    // 获取请求的参数(办事的材料)查看
            String username = req.getParameter("username");
            System.out.println("在 Servlet2 (柜台 2 )中查看参数(材料):" + username);
    // 查看 柜台 1 是否有盖章
            Object key1 = req.getAttribute("key1");
            System.out.println(" 柜台 1 是否有章:" + key1);
    // 处理自己的业务
            System.out.println("Servlet2 处理自己的业务 ");
        }
    }
    

    xml文件配置同上。

    启动服务器后在浏览器输入:http://localhost:8080/Test/servlet1?username=愷龍然后回车
    结果:

    base 标签的作用

    html>
    <html lang="zh_CN">
    <head>
    <meta charset="UTF-8">
    <title>Titletitle>
    
    <base href="http://localhost:8080/Test/a/b/">
    head>
    <body>
    这是 a 下的 b 下的 c.html 页面<br/>
    <a href="../../index.html">跳回首页a><br/>
    body>
    html>
    

    Web 中的相对路径和绝对路径

    在 javaWeb 中,路径分为相对路径和绝对路径两种:
    相对路径是:
    . 表示当前目录
    .. 表示上一级目录
    资源名 表示当前目录/资源名
    绝对路径:
    http://ip:port/工程路径/资源路径
    在实际使用中,路径都使用绝对路径,而不简单的使用相对路径。
    1、绝对路径
    2、base+相对

    web 中 / 斜杠的不同意义

    在 web 中 / 斜杠 是一种绝对路径。
    / 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
    斜杠
    / 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
    1、/servlet1
    2、servletContext.getRealPath(“/”);
    3、request.getRequestDispatcher(“/”);
    特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。
    得到 http://ip:port/

    如图片失效等情况请参阅公众号文章:https://mp.weixin.qq.com/s/2D8U7Bz-o3FkT0pE33Ms5Q

    欢迎关注公众号:愚生浅末。

  • 相关阅读:
    算法通关村第一关——链表白银挑战笔记
    海藻酸钠-聚乳酸|PLA-alginate|海藻酸钠-PEG-聚乳酸/聚已内酯PCL
    hot100-相交链表
    BIGEMAP在土地规划中的应用
    Linux 程序打包
    Java面试题-JVM
    两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称,根据属性名称处理两个list
    使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号
    三个pwn题
    前端快速学习记录:实现一个原神时钟(简易版)
  • 原文地址:https://www.cnblogs.com/kohler21/p/16567649.html