转发和重定向的联系和区别

页面跳转有两种形式

请求转发(request.getRequestDispatcher("").forward(request, response);)(例如呼叫转移)

1.转发只是在服务器端对同一个request进行传递,没有产生其它请求,转发的操作,浏览器并不知道

2.只有一个请求,因此跳转前后,可以共享保存在request的数据

3.转发操作,浏览器并不知道,所以地址栏是转发之前的地址

public class Demo2Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo2Servlet.service");
        System.out.println("keyboard: " + req.getParameter("keyboard"));
        // 可以跳转受保护资源, 无法跳转外部资源
        req.getRequestDispatcher("WEB-INF/test.html").forward(req, resp);
        // req.getRequestDispatcher("http://www.jd.com").forward(req, resp);
        System.out.println("ok");
    }
}

响应重定向代码(response.sendRedirect("");)

1.服务器发送一个302响应附带下一个跳转的地址,浏览器收到响应后自动向该地址发送一个新的请求

2.跳转前后是两个不同的数据,因此无法共享request数据

3.跳转操作浏览器自动发起,因此地址栏显示的是跳转后的地址

public class Demo2Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo2Servlet.service");
        System.out.println("keyboard: " + req.getParameter("keyboard"));
        // 不能跳转到安全目录, 可以跳转到外部资源
        // 跳转到京东: http://www.jd.com
        resp.sendRedirect("http://www.jd.com");
    }
}

 转发:就像送快递;快递送来的时候,你在工作,快递员将东西放在前台,之后你去前台取;

 重定向:送快递送错后,给你转运;

区别

1.跳转范围

    转发:只限于当前项目,最大也就是当前服务器,可以访问安全目录WEB-INF下的资源

    重定向:可以重定向到互联网的任意位置,无法访问WEB-INF下的资源,由客户端发送请求,客户端默认没有此功能

2.语句不同

    转发:request.getRequestDispatcher("").forward(request, response);

    重定向:response.sendRedirect("");

3.跳转后地址栏路径不同

    转发:跳转之前的地址

    重定向:跳转之后的地址

4.是否可以共享同一个request的数据

     转发:可以共享

     重定向:无法共享

5.效率高低

     转发:效率高

6.转发和重定向的路径

 绝对路径

     转发:不能使用绝对路径

     重定向:可以使用绝对路径

 根路径

     转发:/代表当前项目

     重定向:/当前服务器(加request.getContextPath()动态获取路径)

 相对路径

     都可以使用相对路径,但只可以相对于文件自身,不能相对于基准路径

 路径选择

     跳转到其它服务器,只能使用重定向,也只能使用绝对路径

     跳转到当前服务器的其他项目,只能使用重定向,建议使用根路径

     跳转到当前服务器的当前项目,可以使用转发,建议使用根路径

到底使用转发还是重定向

   1.某些情况下无可选择

     希望前后两个组件共享request数据,使用转发

     跳转到同一应用的WEB-INF目录下只能用于转发

     跳转到不同的应用只能使用重定向

     使用Cookie存储数据需要使用重定向

2.跳转到同一应用

    使用转发效率高,尽量使用转发

    使用转发需要解决重复提交问题,尤其是添加操作

    注销之后一般用重定向

    连续表单页面之间建议使用重定向,避免属性冲突

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值