1、1.重定向在 Servlet 中的接口 HttpServletRequest 提供了 sendRedirect()方法用于生成 302 相应码和 Location 响应头,从而通知客户端去重新访问 Location 响应头指定的 URL,其定义如下:public void sendRedirect(String location ) throws IOException;对于 sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,也可重定向到一个容器中的其他应用程序中的资源。eg:/Servlet1.javapackage com.lkh.redrect;import ja
2、va.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Servlet1 extends HttpServlet Overrideprotected void doGet(HttpS
3、ervletRequest request,HttpServletResponse response) throws ServletException, IOException / TODO Auto-generated method stubthis.doPost(request, response);Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException / TODO Auto-generated m
4、ethod stubresponse.sendRedirect(“Servlet2“); /重定向到指定路径的资源/ RequestDispatcher dis=request.getRequestDispatcher(“Servlet2“);/ dis.forward(request, response);/Servlet2.javapackage com.lkh.redrect;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.se
5、rvlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Servlet2 extends HttpServlet Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException / TODO Auto-generated
6、 method stubthis.doPost(request, response);Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException / TODO Auto-generated method stubresponse.setContentType(“text/html;charset=utf-8“);PrintWriter out = response.getWriter();out.printl
7、n(“);out.println(“ servlet2“);out.println(“ “);out.println(“从 Servlet2 中获取请求参数 name 的值:“);out.println(request.getParameter(“name“);out.println(“ “);out.println(“);同时要在项目中的 web.xml 对 Servlet 进行声明:Servlet1com.lkh.redrect.Servlet1Servlet1/Servlet1Servlet2com.lkh.redrect.Servlet2Servlet2/Servlet22.请求分派在
8、 Servlet 中定义一个接口 RequestDispatcher其方法如下:public void forward(ServletRequest request,ServletResponse response) throws ServletException,IOException;public void include(ServletRequest request,ServletResponse response) throws ServletException,IOException;对于 forward()方法用于将请求转发到 RequestDispatcher 实例封装的资源,i
9、nclude()方法用于将 RequestDispatcher 实例封装的资源作为当前响应的一部分包含进来。获取 RequestDispatcher 实例的方式有两种:(1)调用 ServletContext 接口提供的 getRequestDispatcher(String url) 方法(2)调用 ServletRequest 接口提供的 getRequestDispatcher(String url) 方法ServletContext 接口提供的 getRequestDispatcher(String url) 方法中的路径参数必须以”/“开头ServletRequest 接口提供的 g
10、etRequestDispatcher(String url) 方法中的路径参数可以是相对路径也可为绝对路径。eg:只要将上面中的 Servlet1.java 中的 doPost()代码改为RequestDispatcher dis=request.getRequestDispatcher(“Servlet2“);dis.forward(request, response);3.重定向也和请求分派的比较:请求分派只能将请求转发给同一个 web 应用中的其他组件,而重定向不仅可以定向到当前应用程序中的其他资源,也可重定向到其他站点的资源上重定向的访问过程结束后,浏览器的地址栏显示的 URL 会发生改变,变成重定向的目标 URL,而请求分派的浏览器地址栏保持初始的 URL请求分派的发起者和被调者之间共享相同的 request 实例和 response 实例,属于同一个“请求/响应”而重定向的发起者和被调用者使用各自的 request 实例和 response实例,各自属于独立的“请求/响应”过程。