JavaWeb——Servlet——请求转发与响应重定向

JavaWeb——Servlet——请求转发与响应重定向

导语:在实际的软件开发过程中,往往需要多个Servlet来实现不同的功能,就需要对多个Servlet进行组合调用。多个Servlet之间如何进行通信和跳转?而这就需要用到请求转发与响应重定向技术。
原理
多个Servlet或者说JSP之间跳转有两种方式
注:JSP本质上就是Servlet
①:请求转发:
request.getRequestDispatcher(String).forward(request,response)
②:响应重定向
response.sendDirect(ContextPath)

这两种方式表象上的不同体现在访问地址栏中是否产生了变化:请求转发方式地址栏中的路径不会发生改变,响应重定向方式地址栏中的路径会发生改变。例如现在有ServletA,ServletB这两个Servlet要建立通信当我们在ServletA中采用请求转发的方式将业务转发给ServletB,这时访问ServletA,页面呈现的内容是ServletB中编写的业务,说明ServletA将业务转发给ServletB成功了,此时地址栏中的路径还是ServletA的虚拟目录,但如果采用响应重定向的方式将业务转发给ServletB这时访问ServletA,页面呈现的内容也还是ServletB中编写的,但是地址栏中的路径就变成了ServletB的虚拟目录。
出现这样的差别的原因在于:请求转发只会产生一次请求,它只是在服务器的内部将第一个Servlet的请求转发给了另一个Servlet去处理;响应重定向会产生两次请求,一个Servlet将请求第一次处理完了之后,由浏览器再发一个新的请求让另一个Servlet去处理。所以采用响应重定向时,地址栏会发生变化。
当使用request.setAttribute(String,Object)方法在ServletA中自定义属性时,通过请求转发的技术在ServletB中通过request.getAttribute(String)方法能够获取到对应的属性值,这是因为是同一个请求携带的数据,但是如果采用的是响应重定向技术,就获取不到属性值,这一点就证实了响应重定向技术其实是两次不同的请求,所以ServletB中获取不到ServletA中定义的属性值。

【案例1】
需求:体验请求转发技术
JavaWeb——Servlet——请求转发与响应重定向_第1张图片
JavaWeb——Servlet——请求转发与响应重定向_第2张图片

代码显示结果
JavaWeb——Servlet——请求转发与响应重定向_第3张图片

关于路径的一点小提醒:采用请求转发技术时,如果是两个Servlet之间的转发ServletA将业务转给ServletB这时在request.getRequestDispatcher(String path)括号中的路径就为"/转发目的地的Servlet的虚拟目录",如上例中的“/JumpPage”。如果是转发到JSP页面括号中的路径就为"/文件名.jsp"。

【案例2】
需求:体验响应重定向技术

JavaWeb——Servlet——请求转发与响应重定向_第4张图片
JavaWeb——Servlet——请求转发与响应重定向_第5张图片

代码显示结果JavaWeb——Servlet——请求转发与响应重定向_第6张图片

你可能感兴趣的:(java)