servlet无法跳转到jsp页面

RequestDispatcher dispatcher=request.getRequestDispatcher("/GoodsCar.jsp");
dispatcher.forward(request, response);
我把response.sendRedirect("login.jsp");放在第二句前面时,还可以跳转,但是放在第二句后面的时候,就不可以跳转了

首先要理解这两句话的意思
request.getRequestDispatcher().forward(request,response)这句话是把你的请求扔到了另外的服务上面了,像你上面这么写的话,就是把原来的请求扔给了GoodsCar.jsp去处理,如果你其他东西没有写错的话,页面应该会跳转到GoodsCar.jsp,而在这个jsp里面的request对象其实跟原来你的servlet里面的是同一个,servlet里面的request可以拿到的东西,这个jsp的request也可以拿到,因为它是servlet直接扔过来的,这个动作是由servlet发起的,所以客户端其实并不知道,留意一下你浏览器上面的url你就知道了,不管servlet里面forward到哪里去,你浏览器上面的url依然是这个servlet的地址,说明浏览器根本就不知道servlet已经把请求扔到别的地方去处理了。
response.sendRedirect()这句话是指示客户端重定向请求。客户端把请求发到servlet之后,servlet处理后给出来的响应是跟客户端说:“你去访问login.jsp吧”,然后客户端就会重新发送一个请求去login.jsp,但是这个请求跟之前发送给servlet的请求已经不是同一个。这个动作经历了三步,第一部是客户端发送请求到servlet,第二步是servlet返回相应,第三步是客户端重新定向请求。最后重定向的动作是由客户端发出的,所以你可以看到你的浏览器上面的地址是变了的。

最后解释一下你的问题,你把forward放在sendRedirect前面,servlet执行到forward的时候就已经把请求扔到别的地方去了,sendRedirect被活生生吞掉了。而如果你把sendRedirect放在前面的话,servlet执行到sendRedirect的时候,就已经把相应返回了,后面的forward也是被硬生生弄没了。如果你所有代码都写正确的话,那效果应该就是上述那样的,如果还是不行的话,我感觉就是你的路径写得有问题,仔细检查一下。追问

呃。。。我有点混乱。。。可以讲的通俗一点吗?
就是造成这个的原因是什么?
那两句话我是照着书上打的,在其他servlet里面都可以运行的

追答

最好的办法就是……不要一齐用,关键是放一齐也没用,谁放前面,就执行谁,后面放多了反而可能出一些奇奇怪怪的问题,原因就是上面写的,以后可以一边看一边体会

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-16
前两位的回答都比较明晰。
forward是服务器端跳转语句,看你的代码, dispatcher.forward(request, response);会跳到GoodsCar.jsp页面
而sendRedirect也是跳转语句,看你的代码,response.sendRedirect("login.jsp")会跳到login.jsp页面。
两个都是跳转语句,你说的把response.sendRedirect("login.jsp");放在第二句前面时,还可以跳转,是可以跳转到login.jsp页面;“放在第二句的后面,就不能跳转”这句话不对,如果放在第二句 的后面,会跳转到GoodsCar.jsp页面。
你能不能够理解?dispatcher.forward(request, response);和response.sendRedirect("login.jsp");都是跳转语句,执行任何一句,页面就会跳转了,下面的一句话当然不会执行了。追问

但是放在第二句的后面之后,它就停留在servlet页面,login这个不能跳,我懂了,但是GoodsCar.Jsp也不能跳,我就不知道为什么了

本回答被网友采纳
第2个回答  2018-06-28
首先要理解这两句话的意思
request.getRequestDispatcher().forward(request,response)这句话是把你的请求扔到了另外的服务上面了,像你上面这么写的话,就是把原来的请求扔给了GoodsCar.jsp去处理,如果你其他东西没有写错的话,页面应该会跳转到GoodsCar.jsp,而在这个jsp里面的request对象其实跟原来你的servlet里面的是同一个,servlet里面的request可以拿到的东西,这个jsp的request也可以拿到,因为它是servlet直接扔过来的,这个动作是由servlet发起的,所以客户端其实并不知道,留意一下你浏览器上面的url你就知道了,不管servlet里面forward到哪里去,你浏览器上面的url依然是这个servlet的地址,说明浏览器根本就不知道servlet已经把请求扔到别的地方去处理了。
response.sendRedirect()这句话是指示客户端重定向请求。客户端把请求发到servlet之后,servlet处理后给出来的响应是跟客户端说:“你去访问login.jsp吧”,然后客户端就会重新发送一个请求去login.jsp,但是这个请求跟之前发送给servlet的请求已经不是同一个。这个动作经历了三步,第一部是客户端发送请求到servlet,第二步是servlet返回相应,第三步是客户端重新定向请求。最后重定向的动作是由客户端发出的,所以你可以看到你的浏览器上面的地址是变了的。
第3个回答  2012-06-16
dispatcher.forward(request, response);
已经跳转了啊追问

什么意思?已经跳转了?

追答

dispatcher.forward(request, response);
就是跳转啊 既然已经跳转了 这个之后的的语句都不会被执行了

追问

恩恩,那说明我程序已经运行到最后一步了,那为什么结果还是待在servlet里,没有跳转到GoodsCar.jsp页面啊?
我把response.sendRedirect("login.jsp");放第一句话后面,都还可以跳转,这是为什么啊?

追答

....response.sendRedirect("login.jsp"); 这个是重新定向地址
只要使用
RequestDispatcher dispatcher=request.getRequestDispatcher("/GoodsCar.jsp");
dispatcher.forward(request, response);
这2句就能跳转了 如果跳转不了 你看看是不是你写的路径有问题
/GoodsCar.jsp是绝对路径
login.jsp是相对路径

追问

可以加QQ具体说一下不?我们明天交作业。。这样说好慢