request
实现请求转发:
servlet api
提供了 一个 RequestDispatcher
接口,俗称 请求分派器。
它定义了如下两个 请求转发 方法:
public void forward(ServletRequest request, ServletResponse response)
public void include(ServletRequest request,ServletResponse response)
获取
RequestDispatcher
实例的方式主要有两种:
调用
ServletContext
接口提供的getRequestDispatcher(String url)
方法。
调用ServletRequest
接口提供的getRequestDispatcher(String url)
方法。
url
为要转发 过去 的 本应用内url
RequestDispatcher
:
例:
// 返回指定 属性的 值 作为对象,如果没有给定名称的属性,则返回null
if(request.getAttribute("lol")!=null) {
System.out.println("该请求中无此参数");
// 添加 一个 请求 参数
request.setAttribute("lol", "haha");
}
else if (request.getAttribute("lol").toString()=="haha") {
System.out.println("我会重置此参数的值");
// 重置 该请求参数
request.setAttribute("lol", "wawa");
}
else {
System.out.println("其他情况我会删除 该参数");
// 删除 该参数
request.removeAttribute("lol");
}
// 获取全部属性
Enumeration<String> enumeration = request.getAttributeNames();
//将 该请求 实现转发
request.getRequestDispatcher("./Demon").forward(request, response);
request
对象提供了一个getRequestDispatcher
方法,该方法返回一个RequestDispatcher
对象,调用这个对象的forward
方法可以实现请求转发。
request
对象同时也是一个域对象,开发人员通过request
对象在实现转发时,把转发前 修改后的 数据 可以 通过request
对象 带给其它web资源
处理。
对request
中 的数据对象进行操作:
setAttribute() //若无此属性 在此请求中存储 ,若有 属性在请求之间重置。
getAttribute() // 获取该属性 的值 ,并作为 对象(object) 处理
removeAttribute() // 移出该属性
getAttributeNames() // 获取全部属性 的名称 作为 枚举类型 使用
注意
forward
方法用于将请求转发到RequestDispatcher
对象封装的资源。- 如果在调用
forward
方法之前,在Servlet
程序中写入的部分内容已经被传送到了客户端
forward
方法抛出IllegalStateException
异常。 - 如果在调用
forward
方法之前向Servlet
引擎的缓冲区response
中写入了内容
只要写入到缓冲区中的内容还没有被真正输出到客户端,forward
方法就可以被正常执行
除已写入到HttpServletResponse response
对象中的响应头字段信息
保持有效 外 , 转发前 其它写入到输出缓冲区中的 内容将被清空,
请求重定向(402)和请求转发的区别
-
请求转发:
-
一个
web
资源收到客户端请求后,通知服务器去调用
另外一个web
资源 进行处理
请求重定向
-
一个
web
资源收到客户端请求后,通知浏览器去访问
另外一个web
资源
通过HttpServletResponse.sendRedirect()
方法 实现
可重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL
重定向到其他站点的资源。
但不进行处理
路径区别
HttpServletResponse.sendRedirect
方法的相对URL以/
开头,它是相对于整个WEB站点的根目录;
创建RequestDispatcher
对象时指定的相对URL以/
开头,它是相对于当前WEB应用程序的根目录
如同
www.pan.baidu.com
和www.pan.baidu.com/disk/
的区别
调用HttpServletResponse.sendRedirect
方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由 初始的URL 地址变成重定向的 目标URL;
调用RequestDispatcher.forward
方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
HttpServletResponse.sendRedirect
方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;
RequestDispatcher.forward
方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
RequestDispatcher.forward
方法的调用者与 被调用者之间共享相同的request
对象和response
对象,它们属于同一个访问请求和响应过程;
而HttpServletResponse.sendRedirect
方法调用者与被调用者使用各自的request
对象和response
对象,它们属于 两个独立的访问请求和响应过程。