您的位置:首页 > 编程语言 > Java开发

JAVA 的服务器重定向:使用forward()方法转发请求和使用 sendRedirect()方法重定向的区别

2016-10-03 17:34 585 查看
转载于:http://blog.csdn.net/caixiexin/article/details/6642050

使用RequestDispatche r的 forward()方法转发请求和使用HttpServletResponse的 sendRedirect()方法重定向都可以使页面转到另外一个页面,现在收集一下两者的不同:

一、

RequestDispatcher.forward()方法:

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 
服务方(如:servlet)将请求转发到同一个WEB应用程序中另一个Servlet(或:JSP)--第三方 进行处理(该过程浏览器方-客户方并不知道),让这个第三方直接将结果返回给浏览器方。

通常在servlet中使用的代码是:

request.getRequestDispatcher(跳转页面的Url).foward(request,response); 

 

  如何得到RequestDispatcher

  有三种方法可以得到Request Dispatcher对象。

  1.javax.servlet. ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。

  2.javax.servlet. ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。

  3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。

  这三种方法的使用有细微的差别。比如,下面是一个应用的配置文件web.xml:

  其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的链接访问:

  http://localhost:8080/servlet/firstservlet/

  使用1中方法,例如在firstservlet可以写入下面的代码:

  RequestDispatcher rd = request.getRequestDispatcher("secondservlet");

  rd.forward(request, response);

  此时控制权将转向到第二个Servlet了。

  使用2中的方法,可以从Servlet Context中得到RequestDispatcher代码如下:

  RequestDispatcher rd = getServletContext().getRequest

  Dispatcher("/servlet/secondservlet");

  rd.forward(request, response);

  使用3中的方法,从上面的web. xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:

  RequestDispatcher rd = getServletContext().getNamedDispatcher("SecondServlet");

  rd.forward(request, response);

  这样也可以重定向到SecondServlet了。

二、

sendRedirect()方法:

response.sendRedirect(跳转页面URL)

就是服务端根据逻辑,发送一个状态码(Location ,状态码320),告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

服务方(如:servlet)直接将目标URL发回浏览器,让浏览器自己自动重新向目标URL发出HTTP请求。 

重定向是作为不同请求来看待的。

 

 
三、 

 如何选择



 



  RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  forward sendRedirect
相关文章推荐