(11)Servlet的请求重发与重定向

(11)Servlet的请求重发与重定向

一、请求转发

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"); // 这里就是重定向
}