1.概述
今天在写项目的时候,遇到了一个重定向出的问题,最后用请求转发得以解决;我们知道请求转发和重定向都可以实现页面的跳转,区别是请求转发不会改变浏览器的Url并且使用的是同一对request和response对象,而重定向则会改变浏览器的url并且会产生多对request和response对象。
2.问题的产生和解决
2.1问题的产生
那么我今天遇到的问题是如何产生的呢?我是在Servlet里面设置在请求域里数据,然后想要在jsp里面取出数据,由于我用的是重定向跳转页面,也就是会产生多个请求和响应对象,但我在原来的请求域中设置了数据,但是我在页面跳转之后想在别的请求域取数据,于是取出的数据为null。
2.2问题的解决
由于使用重定向导致了前后请求域发生改变,因此我改用请求转发之后,跳转页面前后请求域一致,能正常取出数据,问题得以解决
3.代码和错误截图
3.1 jsp代码
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.yw.pojo.User" %><%--
Created by IntelliJ IDEA.
User: YOga2
Date: 2024/6/2
Time: 16:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<th>用户id</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>地址</th>
<th>邮箱</th>
<th>QQ</th>
</tr>
<%
ArrayList<User> list = (ArrayList<User>)request.getAttribute("list");
for (User user : list) {
%>
<tr>
<td><%=user.getId()%></td>
<td><%=user.getName()%></td>
<td><%=user.getGender()%></td>
<td><%=user.getAge()%></td>
<td><%=user.getAddress()%></td>
<td><%=user.getEmail()%></td>
<td><%=user.getQq()%></td>
</tr>
<%
}
%>
</table>
</body>
</html>
3.2Servlet代码
@WebServlet(name="ListServlet",urlPatterns={"/list"})
public class ListServlet extends HttpServlet {
ListDao listDao = new ListDao();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//2.执行业务
ArrayList<User> list = listDao.list();
//3.将数据保存到域中
req.setAttribute("list",list);
//4.请求转发跳转页面
//原错误:重定向跳转页面
//resp.sendRedirect("list.jsp");
req.getRequestDispatcher("list.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
3.3错误信息截图