请求转发与重定向的区别,并介绍请求转发与重定向

请求转发与重定向的区别,并介绍请求转发与重定向

请求转发与重定向的区别

一.请求转发与重定向的区别
1)

重定向对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求,这个过程好比有个叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。

由此可见,重定向的时候,“浏览器”一共发出了两封信和收到了两次回复,“浏览器”也知道他借到的钱出自李四之手。

而请求转发方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。

由此可见,转发的时候,“浏览器”只发 出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。

2)重定向
两次请求,两次响应
重定向不携带数据
重定向地址栏发生改变
3)转发
一次请求,一次响应
转发需要携带数据
转发地址栏不会发生变化
4) 使用
如果要保留请求域中的数据,使用转发,否则使用重定向。
以后访问数据库,增删改使用重定向,查询使用转发。
5)小结
1、转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();
2、转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;
3、转发是服务器行为,重定向是客户端行为;
4、转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;
5、转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)。

在这里插入图片描述

请求转发

二.请求转发
1)什么是请求转发
浏览器访问Servlet1,Servlet1将参数处理得到结果,没有直接返回给浏览器,而是将结果带给Servlet2,由Servlet2再处理之后返回给浏览器
在这里插入图片描述
2 )代码实现

request.getRequestDispatcher("/demo07").forward(request, response);

在这里插入图片描述
3)特点
1.地址栏不发生变化,显示的是上一个页面的地址
2.请求次数:只有1次请求
3.请求域中数据不会丢失

4).例子
Servlet01

@WebServlet("/demo01")
public class Demo06Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //将"游戏本"添加到请求中,携带到下一个servlet
        //1 存数据
        request.setAttribute("name","电脑");
        //2 携带到下一个servlet,只能使用转发
  request.getRequestDispatcher("/demo07").forward(request, response);
    }
}
(这就是第一个Servlet01,通过请求转发发给下一个Servlet02)

Serlvet02

@WebServlet("/demo02")
public class Demo07Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 取数据
        String name = (String) request.getAttribute("name");
        //2 组装标签后,响应给浏览器
        response.setContentType("text/html;charset=utf-8");
response.getWriter().println("<font color='red'>"+name+"</font>");
    }
}

重定向

三.重定向
1)什么是请求转发
浏览器访问Servlet1,Servlet1不知道结果,但是Servlet1知道Servlet2知道结果,将Servlet2的地址返回给浏览器,浏览器根据Servlet1给的地址访问Servlet2,Servlet2将参数处理得到结果返回给浏览器

在这里插入图片描述

2 )代码实现

response.sendRedirect(request.getContextPath()+"要跳转的页面")

3 )特点
两次请求,两次响应
重定向不携带数据
重定向地址栏发生改变

4)例子
Servlet01

@WebServlet("/demo01")
public class Demo06Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 存数据
        request.setAttribute("name","电脑");
response.sendRedirect(request.getContextPath()+"demo02")
    }
}

Servlet02

@WebServlet("/demo02")
public class Demo07Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
response.getWriter().println(request.getAttribute("name"));
    }
}

猜你喜欢

转载自blog.csdn.net/mighty_Jon/article/details/108960204