请求转发和请求重定向问题

请求转发(用于数据绑定)

转发:是将请求在服务器内部交给另一个组件再去执行,同时共享request中的数据

特点
① 转发是由服务器内部实现的,不会再由浏览器发出一个新的请求,因为不是一个新的请求,所以地址栏不变
② 在最终的servlet中,request对象和中转的对象是同一个对象
③ 转发共享request中的请求

转发过程:
浏览器发出请求,Tomcat接收,用servletA的doGet()方法,调用getRequestDispatcher()方法获取rd对象,然后调用forward()方法,再通知tomcat说要将请求转发到servletB上去。tomcat服务器copy一份request到另一个类中,再去请求servletB,servletB处理请求,然后输出响应给Tomcat,tomcat将response给servletA,servletA再将response给Tomcat,然后tomcat将响应给服务器

request作为域对象传值问题:
request和servletContext同样可以作为域对象保存数据,但request方法必须将request传递给另一个servlet,另一个servlet才能获取request中的数据,而servletContext在任何servlet里面都可以直接获取其对象

重定向

特点:
①浏览器会向服务器发送两次请求,意味着会有两个request/respose
②浏览器地址栏会发生变化。
③不会共享request中的数据。
④执行重定向状态码为302.
⑤重定向的URL可以是其他应用,不局限于当前应用,例如重定向到百度
转发过程:浏览器发出请求,Tomcat接收,用servletA的doGet()方法,调用sendRedirect()方法进行重定向,/302返回tomcat,(location=“你在sendRedirect()里面写的地址”),然后返回浏览器,浏览器根据你返回的地址在此发出了请求,然后正常走一遍。

两者的区别:

本质区别:请转发发了1次请求,重定向发了两次请求
①  请求转发:地址栏还是请求的地址栏
   重定向:地址栏不再是第一次请求的地址,而是最后一次请求的地址

②  请求转发:在最终的servlet中,request对象和中转的对象是同一个对象
   重定向:在最终的servlert中,request对象和中专的request对象不是同一个对象

③  String path = “/testServlet”;请求转发有斜线,没问题,斜线代表当前web应用的根目录
   response.sendRedirect("/testServlet");重定向有斜线,有问题,重定向斜线代表当前web站点的根 目录(localhost:8080)

④  请求转发:只能转发到当前web应用
   重定向:可以重定向到外部资源

end

猜你喜欢

转载自blog.csdn.net/qq_37989076/article/details/87879990