转发
1.
1.
1. 转发一般不推荐使用 ServletContext,一般使用HttpServletRequest实现转发;
2.
2.
2. 转发的路径不能加项目路径(系统已经加好了)。
public class ForwardServlet_ extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.getRequestDispatcher("/get").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>fw</servlet-name>
<servlet-class>com.tl.servlet.ForwardServlet_</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>fw</servlet-name>
<url-pattern>/fw</url-pattern>
</servlet-mapping>
输入Http://localhost:8080/s1/fw会跳转到Http://localhost:8080/s1/get的页面上,但是url地址保持不变;(s1是项目路径)
转发的原理如上图,浏览器请求A,A请求B,并把响应一级一级往上返,这样浏览器就能间接地访问到B
重定向
1. 1. 1. 重定向的项目路径必须加上(系统没给加)。
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*实现原理:
resp.setHeader("Location","/r/img");
resp.setStatus(302);//302是状态数,表示重定向
*/
resp.sendRedirect("/s1/ran");//路径需要加上项目路径/s1
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>RedirectServlet</servlet-name>
<servlet-class>com.tl.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RedirectServlet</servlet-name>
<url-pattern>/red</url-pattern>
</servlet-mapping>
输入Http://localhost:8080/s1/red,url地址会变到Http://localhost:8080/s1/ran
重定向的原理图:浏览器会直接访问B,因此url地址会发生变化。
转发与重定向的区别
面试题:请你聊聊重定向和转发的区别?
相同点:
页面都会实现跳转
不同点:
请求转发的时候,url不会产生变化 ;307
重定向时候,url地址栏会发生变化; 302