页面跳转的方式:
重定向,转发
response.sendRedirect(地址)被称为重定向,地址栏会改变
request.getRequestDispatcher(地址).forward(request,response)称为转发,地址栏不会变化
它们两个的功能都是实现页面跳转,而差别是
重定向不会共享同一个请求对象,并且地址栏会改变
转发会共享同一个请求对象(包括数据),地址栏不会变化
重定向
请求A.jsp页面,那么A页面获得请求执行了重定向操作,也就是response.sendRedirect("B.jsp")
表示页面跳转到B.jsp
而事实上这个重定向并不是马上响应B.jsp页面给客户浏览器,而是返回了这个B.jsp的地址给客户浏览器
客户浏览器得到这个地址后进行了第二次请求,才获得B.jsp的实际页面
正因为是二次请求(第一次请求的是A,第二次请求的是B),所以地址栏会及时更新为最后一次请求的地址,并且两次请求两个请求对象
自然不共享数据
转发
请求A.jsp页面,那么A页面获得请求执行了转发操作,也就是request.getRequestDispatcher("B.jsp").forward(request,response)
表示前往B.jsp页面
而事实上服务器确实会在A页面的代码执行完毕后继续调用B页面继续处理,而B页面中的request和response对象是从A页面传递过来的,是同一个
B页面处理完毕后会响应B页面给客户浏览器
而在整个过程中,我们仅发出一个请求(请求A.jsp页面),而A页面到B页面的操作是服务器完成的,客户浏览器毫不知情,所以地址栏不会有任何变化
所以最后变成了我们现在看到的地址和页面不匹配的情况
转发和重定向各有特点,一般来说:
重定向,转发
response.sendRedirect(地址)被称为重定向,地址栏会改变
request.getRequestDispatcher(地址).forward(request,response)称为转发,地址栏不会变化
它们两个的功能都是实现页面跳转,而差别是
重定向不会共享同一个请求对象,并且地址栏会改变
转发会共享同一个请求对象(包括数据),地址栏不会变化
重定向
请求A.jsp页面,那么A页面获得请求执行了重定向操作,也就是response.sendRedirect("B.jsp")
表示页面跳转到B.jsp
而事实上这个重定向并不是马上响应B.jsp页面给客户浏览器,而是返回了这个B.jsp的地址给客户浏览器
客户浏览器得到这个地址后进行了第二次请求,才获得B.jsp的实际页面
正因为是二次请求(第一次请求的是A,第二次请求的是B),所以地址栏会及时更新为最后一次请求的地址,并且两次请求两个请求对象
自然不共享数据
转发
请求A.jsp页面,那么A页面获得请求执行了转发操作,也就是request.getRequestDispatcher("B.jsp").forward(request,response)
表示前往B.jsp页面
而事实上服务器确实会在A页面的代码执行完毕后继续调用B页面继续处理,而B页面中的request和response对象是从A页面传递过来的,是同一个
B页面处理完毕后会响应B页面给客户浏览器
而在整个过程中,我们仅发出一个请求(请求A.jsp页面),而A页面到B页面的操作是服务器完成的,客户浏览器毫不知情,所以地址栏不会有任何变化
所以最后变成了我们现在看到的地址和页面不匹配的情况
转发和重定向各有特点,一般来说:
传递数据用转发
其他情况用重定向
但是也有的时候会有例外,这个例外遇到再说
但是也有的时候会有例外,这个例外遇到再说