请求转发与重定向

一 请求转发与重定向的作用以及怎样用(通过举例子)
我们再实际开发程序时,一个可用的程序,必须考虑方方面面。当用户从客户端发来请求,我们必须要有对应的服务器servlet来处理客户端发来的请求,有人说那用一个servlet来处理不就行了;但是如果这种想法是不可取的。古人说的好:“闻道有先后,术业有专攻。”就好比医院就是一个服务器,每一个科室对应一个web程序,每个科室里面的大夫都对应一个servlet。所以我们去看病的时候就会发生以下的事情
1 请求转发(在一个web程序里执行):比如张三去医院看病,他去内科1室(A servlet)看病,但是对看的结果不是很满意,或者有出入;于是挂号去了内科2室(B servlet)去看病,但是要点来了,必须先把再内科1室看的诊断详情、诊断大夫的信息带上请求下一个大夫(内科2室)来给他做新一轮的诊断。在这个新一轮的诊断过程,大夫可根据病人的实际情况,来对第一个大夫的诊断作以修改,并且添加自己的看法。
代码展示:

// 1请求(挂号)
 RequestDispatcher rd = request.getRequestDispatcher("/需要跳转的url-pattern");
//2 挂号成功,并且带着刚才的request和response 
//参数request就是携带客户端的请求信息(内科一室的诊断证明)
// 参数response为了为了给客户端响应
rd.forward(request, response);

请求转发的特点
(1) 请求转发需要 RequestDispatcher 的支持,通过request.getRequestDispatcher 方法得到 RequestDispatcher 对象。并且调用RequestDispatcher 的 forward 方法传递 request 与 response。
(2)请求转发。request 数据从第一个 servlet 到第二个 servlet 不会丢失,因为是通过forward方法把request ,response通过传参传进去。
(3)请求转发只能在一个 webApp 内部转发。
(4)如果请求的第一个 servlet 方法是 doGet,那么转发给其它 Servlet 的方法
也是 doGet,也就是说,所有的请求方法类别一致。
(5)请求转发地址栏显示的依然是第一个请求资源路径(从始至终无论你请求转发了n次,url不变)
2 重定向(跨web程序):比如李四去看病,他就是感觉自己不舒服,但是不知道自己到底是得了什么病,然后就去外科挂号检查,但是外科大夫告诉李四,他身体的不舒服不是由外科这些病引起的,可能是心内科有关疾病,所以李四又去挂了个心内科科室,没想到就是因为整天熬夜工作,导致心脏上的疾病,随后谨听医师意见与相关治疗。
代码展示:

//外部重定向
response.sendRedirect("/webName" + "/servletName");
// webName(另一个科室的名字)   servletName(那个科室对应的大夫)

//内部重定向(了解就行,我认为用处不是很大)
response.sendRedirect(request.getContextPath() + "/servletName");

重定向的特点
(1)使用 response.sendRedirect()方法。
(2)request 数据从第一个 servlet 到第二个 servlet 会丢失,因为没有forward方法如约而至的把request传进去。
(3)重定向可以定向到其它应用程序。
(4)不管第一个请求是 get 还是 post,定向后全部变为默认的 get。
(5)url地址会随重定向改变而改变,最后的url就是最后一个页面相对应的地址(需要和请求转发比较看)。所以可以防止form表单的重复提交(可以自己实践一下,一下子就明白了)。
二 请求转发与重定向的区别与注意事项(特点里面都提过了,再对比一遍)
1 请求转发可以传递数据(数据不会丢失),重定向不能传递数据(数据会丢失)。
2 请求转发只能在一个 web 应用程序内部转发,重定向可以到其他应用程序。
3 请求转发处理完,地址栏 url 路径为第一个(servlet)资源路径。重定向为最后一个资源路径(利用重定向防止表单重复提交)。
4 请求转发不需要加 webApp 名称。重定向需要添加 webApp 名称,但如果是定向到一个程序内部,添加有些繁琐,这时可以不添加,但资源路径不能再写“/”,但是如果大家是新手的话,就规规矩矩写"/",比如再重定向是没有写“/”,url会有问题的(报404)。

以上就是我对请求转发与重定向的理解,如有不对,请您斧正!如果你有任何疑难问题,可以私聊我,我们一起讨论,一起加油!如果看的正合您心意,给小编一个赞吧!谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值