用最普通易懂的例子和风趣诙谐的图片,带你领略java的措辞之美
大家在学javaweb的时候,有个很主要的知识点,便是通过转发和重定向来实现我们的共享信息与页面跳转。那为什么须要跳转和数据共享?
跳转:须要做任务分离(Servlet善于写代码即处理业务逻辑,jsp善于展示页面)通过后台经由代码的逻辑处理后跳转到对应的显示界面。如:点击登录按钮,经由后台代码验证跳转到登录成功或者失落败的界面;共享:Http是无状态的,我们跳转的时候数据无法通报,因此须要做数据共享;我们先看下转发和重定向在代码中是如何运用的
转发的办法:
req.getRequestDispatcher("要跳转的路径").forward(request, response);
重定向跳转的办法:
resp.sendRedirect("要跳转的路径");
要求转发(RequestDispatcher)的过程:
客户首先发送一个要求到做事器端,做事器端创造匹配的servlet,并指定它去实行,当这个servlet实行完之后,它要调用getRequestDispacther()方法,把要求转发给指定的jsp页面,全体流程都是在做事器端完成的。
而且是在同一个要求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后实行完把结果返回给客户端。全体过程是一个要求,一个相应。
重定向(sendRedirect)的事情事理:
客户发送一个要求到做事器,做事器匹配servlet,这都和要求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,以是,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个相应,相应行见告客户端你必须要再发送一个要求,去访问jsp页面。
紧接着客户端收到这个要求后,急速发出一个新的要求,去要求jsp页面,这里两个要求互不滋扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都得到不了。可见,在sendRedirect()里面是两个要求,两个相应。
我们再用一张图片快速理解转发和重定向
转发和重定向大家都知道他们的差异是不同的要求次数,地址栏中的地址是否发生变革,是否能访问web-inf下面的资源和能否访问外部资源。最主要的一点是是否能共享数据,很多人对此表示迷惑,转发是如何实现数据共享或者重定向为什么不支持数据共享的。
下面我们对图片进行举例解析
我向班长借是15元钱,班长说没有(实在是不想借我),班长说小王有,让我去向小王借钱。没办法我只能去找小王借钱,小王很大方直接借我100,说不足再找他。实在这里这便是我们讲的重定向,大家可以看到,我们是发送了两次要求的,一次是和班长借钱一次是和小王借钱。
而转发不同的是我去找班长借钱,班长虽然没有钱,但是班长说我去给你借钱去,班长去找小王借钱,并把借到的钱给我。相对我来说我只发了一次要求,是发送给班长的,而班长把要求进行了转发,但是班长和小王都是在本次要求中的。
那作甚数据共享呢,大家可以看到,我向班长发送了一个15元的要求数据,班长把15元的要求数据转发给小王。末了我还钱的时候,我是直接把钱还给班长的,班长再把这一百元发送给小王,而不是我直接还给小王。
班长相称于中间人,起到的浸染便是数据的共享和交互。而重定向为什么不能实现数据共享呢?
首先我向班长发送借钱要求,班长说没有,要求到这里就结束了,并没有发生数据的共享,而我和小王借钱只是大略的数据交互,不是数据的共享由于和班长没有任何关系。
这便是我对重定向和转发内容的总结,希望可以帮助大家理解。