Servlet请求重定向与请求中转 以及RequestDispatcher接口中的include()方法和forward()方法的区别
Servlet请求重定向与请求转发 以及RequestDispatcher接口中的include()方法和forward()方法的区别
在Servlet程序中 有时需要调用另外一个资源来对浏览器的请求进行响应,则可以通过两种方式来实现:1.调用RequestDispatcher.forward方法来实现,2,调用HttpServletResponse.sendRedirect方法实现的请求重定向。
RequestDispatcher接口
Servlet API中定义了一个RequestDispatcher接口,它定义了RequestDispatcher实例对象的方法。RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源(Servlet ,jsp),并可以通过其中的方法将客户端的请求转发给所包含的资源。
RequestDispatcher借口包含两个方法,forward方法和include方法,
forward将将请求转发到RequestDispatcher对象封装的资源,include方法将RequestDispatcher对象封装的资源作为当前响应内容的一部分包含进来。他们都有两个参数,即传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象
include方法,要注意的是 被包含的Servlet程序不能改变响应消息的状态码和响应头,它里面设置状态码和响应头的语句将被忽略
在forward方法调用之前,如果Servlet程序中写入的部分内容已被传送到客户端,forward方法将抛出IllegalStateException. forward方法执行以后,写入到缓冲区的内容将被清空,后面的写入操作将被忽略。
forward方法的调用者和被调用者的状态码和响应头都不会被忽略。
forward() 与redirect()的区别
HttpServletResponse.sendRedirect方法实现请求重定向,RequestDispatcher.forward方法实现请求转发
forward()仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出重定向后的地址;redirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。forward()更加高效,在其可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,需要跳转到一个其它服务器上的资源,则用sendRedirect()方法。
sendRedirect()方法可以重定向到:当前应用程序中的其他资源,同一站点的其他应用程序中的资源,甚至其他站点的资源。
他们都能使浏览器获得另一个URL所指向的资源。
1.如果传递给HttpServletResponse.sendRedirect方法的相对Url以"/"开头,它是相对于整个web站点的根目录;
如果创建RequestDispatcher对象是指定的Url以”/“开头,他是相对于当前web应用程序的根目
2.HttpServletResponse.sendRedirect方法对浏览器的请求做出响应,响应的结果是让浏览器去重新发出对另外一个URL的访问请求。
RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只显示响应结果,并不知道在服务器内部发生了转发行为。
3,RequestDispatcher.forward方法的调用者和被调用者之间共享相同的request对象和response对象,他们属于同一个访问请求和响应过程;HttpServletResponse.sendRedirect方法调用者和被调用者使用各自不同的request对象和response对象,他们属于两个独立的访问请求和响应过程。
4,这两个方法调用之前都不能有内容已经被输出到客户端,如果缓冲区已有了一些内容,将被清除。
RequestDispatcher接口中的include()方法和forward()方法的区别
请求转发中 RequestDispatcher 接口中的 include ()方法和 forward ()方法的区别
//req 从客户浏览器获取信息
//resp 向客户浏览器发送信息
//forward ()方法的调用
ServletContext context=getServletContext();
RequestDispatcher rd=context.getRequestDispatcher(“/XXXX”);
rd.forward(req.resp);
//include ()方法的调用
RequestDispatcher rd=req.getRequestDispatcher(“XXXXX”);
Rd.include(req.resp);
// 传入的路径参数没有 ’/’ 的含义:没有斜杠表示是相对于当前 Servlet 的路径
区别:
forward ()方法执行完后,它下面的代码将不再执行。
include ()方法执行玩后,下面的代码继续执行。
注意:如果 include ()方法调用的那个 Servlet 中调用了 out.close() 关闭输出流对象;因为一旦关闭,响应将被提交,哪么 include() 方法下面的代码也将不再执行。
文章信息来源:http://aguang520.iteye.com/blog/794640
在Servlet程序中 有时需要调用另外一个资源来对浏览器的请求进行响应,则可以通过两种方式来实现:1.调用RequestDispatcher.forward方法来实现,2,调用HttpServletResponse.sendRedirect方法实现的请求重定向。
RequestDispatcher接口
Servlet API中定义了一个RequestDispatcher接口,它定义了RequestDispatcher实例对象的方法。RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源(Servlet ,jsp),并可以通过其中的方法将客户端的请求转发给所包含的资源。
RequestDispatcher借口包含两个方法,forward方法和include方法,
forward将将请求转发到RequestDispatcher对象封装的资源,include方法将RequestDispatcher对象封装的资源作为当前响应内容的一部分包含进来。他们都有两个参数,即传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象
include方法,要注意的是 被包含的Servlet程序不能改变响应消息的状态码和响应头,它里面设置状态码和响应头的语句将被忽略
在forward方法调用之前,如果Servlet程序中写入的部分内容已被传送到客户端,forward方法将抛出IllegalStateException. forward方法执行以后,写入到缓冲区的内容将被清空,后面的写入操作将被忽略。
forward方法的调用者和被调用者的状态码和响应头都不会被忽略。
forward() 与redirect()的区别
HttpServletResponse.sendRedirect方法实现请求重定向,RequestDispatcher.forward方法实现请求转发
forward()仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出重定向后的地址;redirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。forward()更加高效,在其可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,需要跳转到一个其它服务器上的资源,则用sendRedirect()方法。
sendRedirect()方法可以重定向到:当前应用程序中的其他资源,同一站点的其他应用程序中的资源,甚至其他站点的资源。
他们都能使浏览器获得另一个URL所指向的资源。
1.如果传递给HttpServletResponse.sendRedirect方法的相对Url以"/"开头,它是相对于整个web站点的根目录;
如果创建RequestDispatcher对象是指定的Url以”/“开头,他是相对于当前web应用程序的根目
2.HttpServletResponse.sendRedirect方法对浏览器的请求做出响应,响应的结果是让浏览器去重新发出对另外一个URL的访问请求。
RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只显示响应结果,并不知道在服务器内部发生了转发行为。
3,RequestDispatcher.forward方法的调用者和被调用者之间共享相同的request对象和response对象,他们属于同一个访问请求和响应过程;HttpServletResponse.sendRedirect方法调用者和被调用者使用各自不同的request对象和response对象,他们属于两个独立的访问请求和响应过程。
4,这两个方法调用之前都不能有内容已经被输出到客户端,如果缓冲区已有了一些内容,将被清除。
RequestDispatcher接口中的include()方法和forward()方法的区别
请求转发中 RequestDispatcher 接口中的 include ()方法和 forward ()方法的区别
//req 从客户浏览器获取信息
//resp 向客户浏览器发送信息
//forward ()方法的调用
ServletContext context=getServletContext();
RequestDispatcher rd=context.getRequestDispatcher(“/XXXX”);
rd.forward(req.resp);
//include ()方法的调用
RequestDispatcher rd=req.getRequestDispatcher(“XXXXX”);
Rd.include(req.resp);
// 传入的路径参数没有 ’/’ 的含义:没有斜杠表示是相对于当前 Servlet 的路径
区别:
forward ()方法执行完后,它下面的代码将不再执行。
include ()方法执行玩后,下面的代码继续执行。
注意:如果 include ()方法调用的那个 Servlet 中调用了 out.close() 关闭输出流对象;因为一旦关闭,响应将被提交,哪么 include() 方法下面的代码也将不再执行。
文章信息来源:http://aguang520.iteye.com/blog/794640