转发和重定向
转发
转发的特点
- 地址栏不发生变化,显示的是上一个页面的地址
- 请求次数:只有1次请求
- 根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
- 请求域中数据不会丢失
重定向
重定向的特点
- 地址栏:显示新的地址
- 请求次数:2次
- 根目录:http://localhost:8080/ 没有项目的名字
- 请求域中的数据会丢失,因为是2次请求
小结:重定向和转发的区别
区别 | 转发forward | 重定向sendRedirect |
---|---|---|
根目录 | 包含项目访问地址 | 没有项目访问地址 |
地址栏 | 不会发生变化 | 会发生变化 |
哪里跳转 | 服务器端进行的跳转 | 浏览器端进行的跳转 |
请求域中数据 | 不会丢失 | 会丢失 |
//href中的/user/test会跳转到localhost:8888/user/test
//href中的user/test会跳转到localhost:8888/项目名/user/test
<a href="user/test">你好</a>
@Controller
@RequestMapping("/user")
public class HelloController {
@RequestMapping("/test")
public void upload1(HttpServletRequest request,HttpServletResponse response) throws IOException {
//会跳转http://localhost:8888/mvc1/user/success
//response.sendRedirect("success");
//会跳转到http://localhost:8888/success
//response.sendRedirect("/success");
//地址栏从index.jsp到http://localhost:8888/mvc1/user/test
//另外一个例子是web课程中的,这里写/demo2 也会直接调用/项目/demo2的函数
//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
//HTTP Status 404 – 未找到
//消息/mvc1/user/WEB-INF/pages/success.jsp未找到
//request.getRequestDispatcher("WEB-INF/pages/success.jsp").forward(request, response);
//重定向是给客户端,需要加虚拟目录
//转发给服务器端,不需要加虚拟目录
}
}
@Controller
@RequestMapping("/user")
public class HelloController {
@RequestMapping("/test")
public void upload1(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
System.out.println(request.getContextPath()); //打印/mvc1 项目名称
}
}
@WebServlet("/responseDemo3")
public class ResponseDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发 这里加不加/都会正确
request.getRequestDispatcher("/responseDemo2").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
种一棵树最好的时间是十年前,其次是现在。