HttpServletRequest介绍
HttpServletRequest
代表客户端的请求,用户使用HTTP协议访问服务器,其中的HTTP请求新消息会被封装到HttpServletRequest
中,所以通过HttpServletRequest
,我们可以获取客户端请求的信息。
请求主要有两个应用场景:获取前端传递的参数和请求转发。
1. 获取前端传递的参数
我主要需要掌握两个方法:req.getParameter();
和req.getParameterValues();
req.getParameter();
req.getParameterValues();
我们主要就是靠req.getParameter()
来获取前端传来的参数,而getParameter()
和getParameterValues()
之间的区别就是一个是获取一个参数,一个是获取多个参数。
2.请求转发
关于请求转发,我们使用的语句是:
req.getRequestDispatcher("/success.jsp").forward(req,resp);
其中getRequestDispatcher()
中的参数是请求转发的路径。关于这个路径我们需要知道的是:请求转发的路径在加了"/"之后就默认为项目当前路径,这点和重定向不同。
为了方便我们理解Request的常用方法,我们接下来做一个案例。
在本次案例中,我们需要做一个简单的前端登录页面,此页面将用户填写的数据通过request传给servlet,我们在接受的servlet中获取前段传来的参数并且使用请求转发将路径转发到登录成功页面。
我们需要做:
- 编写一个简单的登录页面和登录成功页面。
- 编写一个serlvet获取request之中的参数,并且使用请求转发将请求转发登录成功页面。
登录页面:
<%@page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/dispatcher" method="post">
Username : <input name="username" type="text"> <br>
Password : <input name="password" type="text"> <br>
爱好 : <input type="checkbox" name="hobbies" value="代码">代码
<input type="checkbox" name="hobbies" value="游戏">游戏
<input type="checkbox" name="hobbies" value="运动">运动
<input type="checkbox" name="hobbies" value="电影">电影
<br>
<input type="submit">
</form>
</body>
</html>
其中我们需要注意:<%@page contentType="text/html;charset=UTF-8" language="java" %>
这句话是将页面的内容格式设置为UTF-8,以此保证出现中文字符不会乱码。
登录成功页面:
<%--
Created by IntelliJ IDEA.
User: 10437
Date: 2023/9/25
Time: 20:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Success</title>
</head>
<body>
<h1>登录成功!!!</h1>
</body>
</html>
接受Servlet:
package com.kuang.servlet;
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 RequestDispatcherServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置req和resp的编码类型
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 2.获取前端参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobbies");
// 3.输出获取的参数
System.out.println("username : " + username);
System.out.println("password : " + password);
System.out.println(Arrays.toString(hobbies));
// 4.请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
我们需要注意在请求或者响应的数据中如果有中文字符的话,我们需要添加.setCharacterEncoding("utf-8")
来预防乱码。
在这个案例中,我们使用request获取username
和password
这两个单体的输入框类型的数据时,我们只需要使用getParameter()
即可。但是在我们获取hobbies
这种多个复选框数据时,就需要使用到getParameterValues()
来获取一个字符数组。
请求转发和重定向
那么在我们学习完请求转发以及重定向之后,我们再次总结一下请求转发以及重定向的区别:
相同点:请求转发和重定向都可以实现页面跳转。
不同点:
- 请求转发在页面跳转之后页面的URL不会改变;重定向在实现页面跳转之后页面URL会改变。造成这个原因是:请求转发实现页面跳转的方式是
客户端
访问的Serlvet A
将请求转发给另一个Servlet B
,B
在处理完转发过来的请求之后,将响应返回给A
,A
之后再把响应转发给客户端
,从始至终只有一个请求;重定向实现页面跳转的方式是客户端
在将请求发送给A
之后,A
将需要访问B
的响应返回给客户端
,客户端
在接受到请求之后,再发一份请求给B
,B
在接受请求并且处理完请求之后,将响应返回给客户端,从始至终有两个请求。 - 请求转发是通过
request
来实现的,重定向是通过response
来实现的。 - 请求转发访问页面的路径是从当前项目路径开始访问的,重定向访问页面路径是从localhost来开始访问的。
- 请求转发的代码是
307
,重定向是302
。
重定向:
请求转发: