请求转发
请求转发可以这样理解:李四通过电话号码找张三,而这个电话号码其实是王五的,所以是王五接到了李四的电话,接到电话后王五知道李四是找张三而且张三跟王五是同事,王五直接把电话给张三,最后张三与李四通过王五的号码进行通话。
请求重定向
请求重定向可以这样理解:李四通过电话号码找张三,而这个电话号码其实是王五的,所以是王五接到了李四打过来的电话,接到电话后王五知道李四是要找张三,这时王五是告诉李四张三的电话号码,让李四自己再打张三的电话号码找他,最后李四是通过张三的号码进行通话。
请求转发与重定向的过程:
代码演示:
注意:观察重定向的目标url和请求转发的目标url
请求重定向:
package cn.hncu.servlets.go;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求重定向原理:后台向客户端浏览器发送 状态码:302 和 一个Location:url
//浏览器接收到 302 后就会自动执行新的请求,请求目的就是 接收到的 url
//HttpServletResponse.SC_FOUND值就是302
//resp.setStatus( HttpServletResponse.SC_FOUND );
// resp.setStatus( 302 );
// resp.setHeader("Location", "/httpWeb/jsps/result.jsp");
resp.sendRedirect("/httpWeb/jsps/result.jsp");
}
}
请求转发:
package cn.hncu.servlets.go;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/forward")
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发是内部转发(站内转发),'/'代表项目根目录
//而请求重定向是站外请求,'/'表示服务器根目录,这里是Tomcat服务器的根目录
//所以重定向的url是:/httpWeb/jsps/result.jsp
req.getRequestDispatcher("/jsps/result.jsp").forward(req, resp);
}
}