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