request对象实现请求转发,请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发
请求转发的应用场景:MVC设计模式。
在MVC设计模式中,Servlet接受数据并进行相应的处理后,通过请求转发让JSP取出数据做显示。这就设计到如何把数据从Servlet带到JSP页面的问题。虽然通过servlContext(setAttribute,getAttribute)做容器做到,但是我们不能这么做,servlContext是所有servlt共享的,当用户并发访问我们的网站时,会出现问题。request对象自身也是一个容器(域对象),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
1.setAttribute方法
2.getAttribute方法
3.removeAttribute方法
4.getAttributeNames方法
请求转发的细节:
1.forward方法用于将请求转发到RequestDispatcher对象封装的资源。
2.如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出illegalStateException异常。
3.如果在调用forward方法之前向Servlet引擎的缓冲区(Response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常的执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。
请求转发和请求重定向的区别:
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。一个文本资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
1.RequestDispatcher.forward方法只能将请求转发给同一个web应用中的组件;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序的资源,甚至是使用绝对URL重定向到其他站点的资源。
2.如果传递给HttpServletResponse.sendRedirect方法的相对URL以"/"开头,它是相当于整个web站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以"/"开头,它是相对于当前WEB应用程序的根目录。
3.调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward方法的请求转发后,浏览器地址栏保持初始URL地址不变。
4.HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另一个URl的访问请求。RequestDispatcher.forward方法在服务器内部将请求转发给另一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
5.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的Request对象和Response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的Request对象和Response对象,它们属于两个独立的访问请求和响应过程。
拓展-RequestDispatcher的include方法:
RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务端包含功能。被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。