【学习笔记】HttpServletRequest

HttpServletRequest

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,和一个代表响应的HttpServletResponse对象

  • 如果要获取客户端请求过来的参数:找HttpServletRequest

  • 如果要给客户端一些响应信息:找HttpServletResponse

 

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过HttpServletRequest的方法,获得客户端的所有信息。

 

主要应用:

获取前端参数

方法:

req.getParameter();  //获取单个
req.getParameterValues();  //获取多个,如多选框等

 

我们通过提交表单的案例,来了解如何获取参数

  • 我们需要一个jsp来展示前端的表单等

    • 表单form有一个属性是action,这个action就表示要把这个表单提交到什么地方

      • action的属性可以为一个页面如 “index.html”,随之form表单中的数据也随同提交到了"inex.html"页面

      • action的属性也可以为一个servlet类如"addUserServlet",同时form表单中的数据也随同提交到了addUserServlet,之后servlet通过requset域对象来获取对应的参数值

      • action的属性也可以为"“或”#",表示把from中的数据提交到当前页面

    • 我们这里要提交到Servlet,所以action中要填注册Servlet时的路径

    • 还需要注意的是,提交的路径需要寻找到项目的路径

      • 使用${context.request.getContextPath()} 找到项目的路径

      • 要使用${},还需要导入jsp的包 javax.servlet.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录</title>
    </head>
    <body>
    <form action="${pageContext.request.getContextPath()}/login" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        爱好:
        <input type="checkbox" name="hobbys" value="唱歌">唱歌
        <input type="checkbox" name="hobbys" value="跳舞">跳舞
        <input type="checkbox" name="hobbys" value="吃饭">吃饭
        <input type="checkbox" name="hobbys" value="睡觉">睡觉
        <br>
        <input type="submit">
    </form>
    </body>
    </html>

    ${pageContext.request.getContextPath()}/login 就代表了要提交到那个Servlet,其中

    ${pageContext.request.getContextPath()} 表示项目的目录

  • 在Servlet中获取这些参数

    package com.wang.servlet;
    ​
    import jakarta.servlet.ServletException;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    ​
    import java.io.IOException;
    import java.util.Arrays;
    ​
    public class RequestServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    ​
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置请求和响应的字符编码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    ​
            //参数就是表单中的 name 属性
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String[] hobbys = req.getParameterValues("hobbys");
            //输出一下这些参数
            System.out.println("========================");
            System.out.println(username);
            System.out.println(password);
            System.out.println(Arrays.toString(hobbys));
            System.out.println("========================");
    ​
            //请求转发
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }
    }

    这里需要注意的是,如果不想让请求和响应的中文乱码,必须要设置

    关于请求的问题:

    这里请求转发是通过request来实现的,调用了getRequestDispatcher()

    其中 “/” 就代表了项目的路径,不需要再写一遍项目路径了,这也是和重定向的区别

  • 新建一个,提交成功后,在Servlet中转发的jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录成功</title>
    </head>
    <body>
    <h1>登录成功</h1>
    </body>
    </html>

 

image-20221015174001036

 

请求转发

//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp)

 

请求转发有两种方式:

  1. 使用request对象的getRequestDispatcher()方法,参数是要转发的jsp或Servlet

    “/” 就代表了项目的目录

  2. ServletContext对象的getRequestDispatcher()方法,与上面相同

 

重定向:

调用response对象的sendRedirect(),参数必须带上项目的路径,如 “ /r/test ”

posted @ 2022-10-15 18:00  GrowthRoad  阅读(64)  评论(0编辑  收藏  举报