都有客户端跳转,服务器端跳转
客户端跳转之后,request属范围不可以在使用,url发生变换
服务器端跳转,request属性范围的变量还可以使用,url不变
首先看jsp
1.客户端跳转用response.sendRedirect(“index.html”);
2.服务器端跳转用
<jsp:forward>
<jsp:param name="xx" value="xx"/>
</jsp:forward>
再来看servlet跳转
resp和req是doGet的接受参数
1.客户端跳转也是用resp.sendRedirect(“index.html”);
2.服务器端跳转
RequestDispatcher rd = req.getRequestDispatcher("index.html");
rd.forward(req,resp);
客户端跳转使用的都是response对象的sendRedirect方法
服务端跳转使用的是request对象的getRequestDispatcher的forward方法
如何记忆呢?forward是服务器内部转发
服务器端跳转是由客户端发送一个请求,请求一个服务器资源——如JSP和Servlet——,这个资源又将请求转到另一个服务器资源,然后再给客户端发送一个响应,也就是说服务器端跳转是客户端发送一次请求,服务器端给出一次响应,比如说我访问1.jsp,在这个1.jsp里面用jsp:forward跳转2.jsp了,这就是访问资源1.jsp,1.jsp又将请求转到2.jsp,最后是2.jsp给用户响应,所以是一次请求,一次响应,要注意的是从始至终,用户是无法获得1.jsp页面的响应的,也就是说对用户来说1.jsp是不存在的,他直接就被内部转发到了2.jsp,但是url还是1.jsp
客户端跳转:服务器会通过response返回响应(参数、状态等)给客户端,然后客户端再根据这些信息跳转到相应的uil中,使用地址重写传递参数response.sendRedirect(“URL?参数名=参数值”),比如用户请求登录页面login.jsp,这时候用户当然可以访问到登录页面,所以login.jsp给了用户的第一次响应,用户输入自己的登录信息之后,跳转到登录页面,登录页面又给用户一次响应,所以是2次响应。
还有一次非常让人困扰的情况,就是1.jsp里面,不需要用户提交参数,直接写上<%=response.sedRedirect(“index.html”)%> 那么就从1.jsp直接跳转到index.html里面了,这样看来,好像和前面的一样啊,一次请求,一次响应,但是实际上,还是有2次响应的,一次是1.jsp的响应,一次是index.html的响应,只是由于这个页面太简单,执行的太快,你感觉不到1.jsp给你的响应,你要知道1.jsp的响应就是那个response对象,把代码改一改,改成response.sendRedirect(“index.html?a=1”),这样我们就设置了1.jsp的响应,而这响应就会传给index.html
客户端跳转,从loging.jsp到index.html,有2个request,2个response
而服务器端跳转,从1.jsp到2.jsp都只有一个request对象,一个response对象
总结:
1.forward跳转:
a.服务器端跳转,地址栏不改变;
b.执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源,尤其是数据库连接资源);
c.request设置的属性在跳转后的页面仍可以使用;
d.使用传递参数。
2.response跳转:
a.客户端跳转,地址栏改变;
b.所有代码执行完毕后跳转;
c.跳转后的页面不能使用上一个页面的request属性;
d.使用地址重写传递参数(response.sendRedirect(“URL?参数名=参数值”))。