三分钟看图学习 快速理解javaweb中转发和重定向
前言:用最通俗易懂的例子和风趣幽默的图片,带你领略java的语言之美
大家在学javaweb的时候,有个很重要的知识点,就是通过转发和重定向来实现我们的共享信息与页面跳转。那为什么需要跳转和数据共享?
1.跳转:需要做责任分离(Servlet擅长写代码即处理业务逻辑,jsp擅长展示页面)通过后台经过代码的逻辑处理后跳转到对应的显示界面。如:点击登录按钮,经过后台代码验证跳转到登录成功或者失败的界面;
2.共享: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元的请求数据转发给小王。最后我还钱的时候,我是直接把钱还给班长的,班长再把这一百元发送给小王,而不是我直接还给小王。班长相当于中间人,起到的作用就是数据的共享和交互。而重定向为什么不能实现输数据共享呢?首先我向班长发送请求,班长说没有,请求到这里就结束了,并没有发生数据的共享,而我和小王借钱只是简单的数据交互,不是数据的共享因为和班长没有任何关系。
这就是我对重定向和转发内容的总结,希望可以帮助大家理解。知识浅薄,不对的地方欢迎大家指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?