转发(forward):RequestDispatcher.forward() 方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
重定向(redirect):HttpServletResponse.sendRedirect() 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的 访问请求。
本质区别:转发是服务器行为,重定向是客户端行为。
请求转发特点:一次请求,浏览器地址不变,访问的是自己本身的web资源,传输的数据不会丢。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己Web之外的资源,传输的数据会丢失。
1.请求转发
(1)forward 可以将请求转发到 WEB-INF目录下的资源
例:return "forward:/WEB-INF/jsp/test.jsp";
(2)转发不能访问 Web 应用外部资源
2.重定向
(1)redirect 不能将请求重定向到 WEB-INF目录下的资源
注:WEB-INF下面的内容都是只能由服务器级别才能访问,客户端并不能访问。转发就是服务器级别,重定向是客户端级别
(2)重定向可以访问 Web 应用外部资源
补充:如何访问WEB-INF下的jsp文件
因为web-inf下,应用服务器把它指为禁访目录,即直接在浏览器里是不能访问到的.
但是可以让servlet进行访问,如web-inf下有a.jsp则可以用
request.getrequestdispatcher("/web-inf/a.jsp").forward(request,response);
补充一下,如果你想访问web-inf下的html文件的话,用
request.getrequestdispatcher("/web-inf/a.htm").forward(request,response);
是访问不了的。
原因很简单,jsp就是servlet,会被编译成class文件,而htm的就不行了。
所以需要配置以下conf下的web.xml文件才能去访问htm。
具体实现如下:
用打开tomcat安装目录下conf下的web.xml文件,找到
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
然后在它下面添加
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
这样的话,你就能用request.getrequestdispatcher("/web-inf/a.htm").forward(request,response);
去访问web-inf下的html了