目录
使用方法:
forward
req.getRequestDispatcher("/myjsp.jsp").forward(req,resp);
sendRedirect
resp.sendRedirect("myjsp.jsp");
区别:
①跳转方式不同:
运用forward方法相当于Servlet直接访问一个别的资源并返回。
而sendRedirect方法是让浏览器重新访问别的URL.
例如表单form的action= "/uu"; sendRedirect( "/uu ");
sendRedirect的"/uu"表示相对于服务器根路径。
如http://localhost:8080/Test应用(则提交至http://localhost:8080/uu);
forward代码中的 "/uu "则代表相对与WEB应用的路径。
如http://localhost:8080/Test应用(则提交至http://localhost:8080/Test/uu);
所以用sendRedirect不要写下划线,才可以访问本应用下的路径
②浏览器地址不同
forward访问后,浏览器url地址不变,
sendRedirect重定向后,浏览器url地址变为目的url地址。
forward()无法跳转至有frame的jsp文件
sendRedirect()可以跳转至有frame的html文件,
同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute( "name ",name)来传至下一个页面。
③响应次数不同
使用forward访问的过程,是浏览器先向目的Servlet发送一次Request请求,然后再服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回Response到浏览器端。浏览器和服务器一次请求响应。
使用sendRedirect重定向的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。浏览器和服务器两次请求响应。
④传参问题
forward方法的调用者与被调用者之间共享Request和Response
sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。
如果使用request.setAttribute传递一些属性就需要用forward,如果想要跳转到别的应用的资源,就需要用sendRedirect。
⑤无论是forward方法还是sendRedirect方法调用前面都不能有PrintWriter输出到客户端。
forward方法报错: Java.lang.IllegalStateException: Cannot forward after response has been committed
sendRedirect报错:java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)