【学习笔记】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>
请求转发
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp)
请求转发有两种方式:
-
使用request对象的getRequestDispatcher()方法,参数是要转发的jsp或Servlet
“/” 就代表了项目的目录
-
ServletContext对象的getRequestDispatcher()方法,与上面相同
重定向:
调用response对象的sendRedirect(),参数必须带上项目的路径,如 “ /r/test ”