请求转发:
方式:request.getRequestDispacther("/test.jsp").forword(request,response);
过程分析:客户端发出一个请求reqeust到服务器,服务器找到相应的Servlet处理数据,然后调用
request.getRequestDispacther("/test.jsp").forword(request,response);
从字面上也可以理解:带着request,response向test.jsp前进!进!(完全自己意淫的,不要当真...)
请求和响应都被送到另一个Servlet或者jsp(特殊的Servlet)中。这样整个过程中,只有一个请求、一个响应,所有 Servlet和JSP都共享它俩(好可怜..),所以所有的Servlet和Jsp都可以从request中获取请求参数。
重定向:
方式:response.sendRedirect("test.jsp");
过程分析:客户端发出一个请求reqeust到服务器,服务器找到相应的Servlet处理数据,到这里都是一样一样的。然后调用
response.sendRedirect("test.jsp");
从字面上也可以理解:返回客户端一个叫test.jsp的页面。(不要当真...)
注意,这个方法是response的方法哦,这个时候它就已经给客户端响应了,这一次的请求、响应过程已经结束了!
但是呢,临了的时候它还告诉客户端,你要去test.jsp哈(死了都不老实,难怪活不过两集敲打)
于是乎客户端又向服务器发出一次去test.jsp的请求,根据http(s)特性,每次请求之间是完全独立的,所以本次请求到test.jsp页面,是不会再获取上一次request中的参数的。
不同点列举:
1、安全性
显然 请求转发更安全。一个请求在完成的过程中可能会通过多个Servlet,最终到达一个jsp页面,在整个过程中,url是不会变的。这样从客户端就看不出来服务器是由哪些资源来处理数据的。
而重定向更遵循”所见即所得“,也就是你所请求的资源,就是url显示的。比如重定向到test.jsp,url可能就是“localhost:8080/project_name/test/test.jsp”.这样不仅不安全,也限制了服务器端的灵活性。
2、可定位范围
重定向范围更广,应该说它可以重定向到任何有效的url。
而转发就比较杯具了,只能在服务器内部转发。