Servlet请求重定向与请求转发 以及RequestDispatcher接口中的include()方法和forward()方法的区别...

在Servlet程序中 有时需要调用另外一个资源来对浏览器的请求进行响应,则可以通过两种方式来实现:1.调用RequestDispatcher.forward方法来实现,2,调用HttpServletResponse.sendRedirect方法实现的请求重定向。

RequestDispatcher接口
Servlet API中定义了一个RequestDispatcher接口,它定义了RequestDispatcher实例对象的方法。RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源(Servlet ,jsp),并可以通过其中的方法将客户端的请求转发给所包含的资源。
RequestDispatcher借口包含两个方法,forward方法和include方法,
[color=red]forward将将请求转发到RequestDispatcher对象封装的资源,include方法将RequestDispatcher对象封装的资源作为当前响应内容的一部分包含进来。他们都有两个参数,即传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象

include方法,要注意的是 被包含的Servlet程序不能改变响应消息的状态码和响应头,它里面设置状态码和响应头的语句将被忽略

在forward方法调用之前,如果Servlet程序中写入的部分内容已被传送到客户端,forward方法将抛出IllegalStateException. forward方法执行以后,写入到缓冲区的内容将被清空,后面的写入操作将被忽略。
forward方法的调用者和被调用者的状态码和响应头都不会被忽略。

[/color]
forward() 与redirect()的区别
HttpServletResponse.sendRedirect方法实现请求重定向,RequestDispatcher.forward方法实现请求转发
forward()仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出重定向后的地址;redirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。forward()更加高效,在其可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,需要跳转到一个其它服务器上的资源,则用sendRedirect()方法。
sendRedirect()方法可以重定向到:当前应用程序中的其他资源,同一站点的其他应用程序中的资源,甚至其他站点的资源。

他们都能使浏览器获得另一个URL所指向的资源。
[color=red]1.如果传递给HttpServletResponse.sendRedirect方法的相对Url以"/"开头,它是相对于整个web站点的根目录;
如果创建RequestDispatcher对象是指定的Url以”/“开头,他是相对于当前web应用程序的根目
[/color]
2.HttpServletResponse.sendRedirect方法对浏览器的请求做出响应,响应的结果是让浏览器去重新发出对另外一个URL的访问请求。
RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只显示响应结果,并不知道在服务器内部发生了转发行为。
3,RequestDispatcher.forward方法的调用者和被调用者之间共享相同的request对象和response对象,他们属于同一个访问请求和响应过程;HttpServletResponse.sendRedirect方法调用者和被调用者使用各自不同的request对象和response对象,他们属于两个独立的访问请求和响应过程。
4,这两个方法调用之前都不能有内容已经被输出到客户端,如果缓冲区已有了一些内容,将被清除。

[color=red]RequestDispatcher接口中的include()方法和forward()方法的区别[/color]

请求转发中 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() 方法下面的代码也将不再执行。


文章信息来源:[url]http://aguang520.iteye.com/blog/794640[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值