请求转发
在Servlet中,如果当前Web资源不想处理它的访问请求,可以通过forward()方法将当前请求传递给其它的Web资源进行处理,这种方式称为请求转发。为了使大家更好地了解如何使用forward()方法实现请求转发,接下来通过一张图来描述forward()方法的工作原理,如图1所示。
图1 forward()方法的工作原理
从图5-30中可以看出,当客户端访问Servlet1时,可以通过forward()方法将请求转发给其它Web资源,其它Web资源处理完请求后,直接将响应结果返回到了客户端。
了解了forward()方法的工作原理,接下来,通过一个案例来学习forward()方法的使用,如例1所示。
例1 RequestForwardServlet.java
1 package cn.itcast.chapter05.request;
2 import java.io.IOException;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class RequestForwardServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse response)
7 throws ServletException, IOException {
8 response.setContentType("text/html;charset=utf-8");
9 // 将数据存储到request对象中
10 request.setAttribute("company", "北京传智播客教育有限公司");
11 RequestDispatcher dispatcher = request
12 .getRequestDispatcher("/ResultServlet");
13 dispatcher.forward(request, response);
14 }
15 public void doPost(HttpServletRequest request, HttpServletResponse response)
16 throws ServletException, IOException {
17 doGet(request, response);
18 }
19 }
在例1中,通过使用forward()方法,将当前Servlet的请求转发到ResultServlet页面,ResultServlet的具体实现如例2所示。
例2 ResultServlet.java
1 package cn.itcast.chapter05.request;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class ResultServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse response)
7 throws ServletException, IOException {
8 response.setContentType("text/html;charset=utf-8");
9 PrintWriter out = response.getWriter();// 获取PrintWriter对象用于输出信息
10 // 获取request请求对象中保存的数据
11 String company = (String) request.getAttribute("company");
12 if (company != null) {
13 out.println("公司名称:" + company + "<br>");
14 }
15 }
16 public void doPost(HttpServletRequest request, HttpServletResponse response)
17 throws ServletException, IOException {
18 doGet(request, response);
19 }
20 }
启动Tomcat服务器,在浏览器中输入URL地址http://localhost:8080/chapter05/RequestForwardServlet
访问RequestForwardServlet,浏览器显示的结果如图2所示。
图2 运行结果
从图2中可以看出,浏览器显示出了ResultServlet中要输出的内容。由此可见,forward()方法不仅可以实现请求转发,还可以使转发页面和转发到的页面共享数据。需要注意的是,存储在request对象中的数据只对当前请求有效,而对其它请求无效。