文章目录
- 一、请求转发
- 1.作用:
- 2.特点:
- 3.代码
- 二、重定向
- 1.作用
- 2.特点
- 3.代码
- 4.示例
- 相关
.
一、请求转发
1.作用:
服务器在接受了浏览器的请求后,如果有只用一个Servlet进行请求处理,会造成不同的Servlet逻辑代码冗余。Servlet职责不明确(你应该不希望每个Servlet都一点相同的事情吧)。
举个例子,请求转发相当于:
客户端请求来了,客户端说:“我要一个页面”。
A(Servlet)说:“我这里是干别的事情的,这里没有你要的页面,不过我知道谁C(Servlet)有,我叫C给你一个页面”。
然后C就响应了一个页面给了客户端。
2.特点:
- 只有1次请求,所以1次响应
- 在两个Servlet中可以共享请求中数据。
- 请求转发之后地址栏的信息并不会有任何的改变。最终的响应由B(Servlet)来决定,和A(Servlet)没有关系。
3.代码
request.getRequestDispatcher("/index.jsp").forward(request,response);
二、重定向
1.作用
解决表单重复提交的问。如果请求中有表单数据,而且数据比较重要,不能重复提交,建议用重定向(你可不希望你付款的时候扣两次商品钱吧)。
当前Servlet无法处理的请求问题,需要重定向到另一个Servlet解决。
2.特点
- 两次请求。
- 地址栏中的地址会改变。
- 因为是两次请求,所以在两个Servlet中不可以共享请求中数据。
- 最终的响应也是由B(Servlet)来决定,和A(Servlet)没有关系。。
3.代码
resp.sendRedirect(req.getContextPath() + "/LoginPageServlet"); // 重定向路径为/LoginPageServlet(req.getContextPath() 这个不加也行,默认就是localhost:8080)
4.示例
我们在这一篇中用到过重定向:Java EE基础(10):第三个Web项目(Servlet登录案例 - 附源码)
LoginServlet 类中:如果登录失败,则重定向到 /LoginPageServlet(登录页面)
// 5.响应处理结果
if (list == null || list.isEmpty()) { // 如果查询到的list为null或者为空,说明登录失败
// 登录失败
System.out.println("登录失败!\n"+user);
// 重定向到登录页Servlet
resp.sendRedirect(req.getContextPath() + "/LoginPageServlet"); // 这里就是重定向
}