servlet请求转发与重定向的区别及页面跳转与传值

此文章为个人理解和总结,如有不足或错误请大家及时提出并纠正,转载请注明出处谢谢

一、请求转发与重定向的区别

转发和重定向流程图如下

请求转发(服务器端转发):

1、客户端(HTML)向服务器发送一条请求,服务端发现匹配的servlet,并指定它去执行。当这个servlet执行完之后,它要调用getRequestDispacther()方法,返回值类型是RequestDispatcher,设定目标资源jsp(jsp==servlet是服务端)。

2、调用forward(ServletRequest req,ServletResponse res):该方法是RequestDispatcher接口的方法,将请求从一个servlet转发到服务器上另一个资源jsp(目标资源)(jsp==servlet是服务端)

3、目标资源jsp(jsp==servlet是服务端)接收转发过来的请求,并将接收数据后的jsp生成HTML返回给客户端

重点:转发是服务器行为,因此也是在这个web应用内转发,整个过程是一个请求一个响应。可以看做一个request请求里包含了多个servlet,多个servlet共享的是同一个request,所以他们之间可以通过getAttribute()读取前一个servlet的存值。

(因为是一次请求,所以地址栏是不会改变的)

由request执行转发操作,request.getRequestDispacther("url").forward(request,response)

 

重定向(客户端跳转):

1、客户端(HTML)发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样。

2、servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你的目标资源在哪里你必须要再发送一个请求,去访问你的目标资源jsp(jsp==servlet客户端)

服务器将你当前请求返回,然后给个状态标示给你,告诉你应该去重新请求另外一个url。

3、紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求你的目标资源jsp(这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了)

4、目标资源jsp把自己生成HTML返回给客户端。

 

重点:重定向是客户端行为,也就注定可以向任何地址发送请求,客户端行为的改变是服务器所给的指示,亦即是response的行为返回,每次请求都是新的行为,request不保留上次的内容。

因为是两次请求,所以地址栏会改变

 

两者最大区别是:运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何 

请求转发重定向
服务器端跳转客户端跳转
客户端总共发送一次请求客户端总共发送两次请求
地址栏URL不会改变地址栏URL会改变

注意:

  • 重定向是不能访问WEB-INF下的资源,WEB-INF的资源只有服务器级别才可以访问。重定向的含义就是服务器把地址发给客户端,让客户端去访问,这样还是在客户端访问的WEB-INF目录,所以是无法访问到WEB-INF目录下的资源。详情请查看Web项目中关于WEB-INF目录的各种问题

 

===================================================================

上面的还是不好理解吗?好吧,下面是白话版场景模拟

请求转发(服务器端转发):

1、我(客户端)要找一本书,我告诉图书管理员(服务器端)我要找什么【第一次请求】

2、管理员帮我找到;

3、并将找到的书翻译成我看的懂的文字(HTML)给我(客户端)

重定向(客户端跳转):

1、我(客户端)要找一本,我告诉图书管理员(服务器端)我要找什么【第一次请求】

2、这个管理员A说这类书不归我管,告诉我让我去找这书所在类别区域的另一个管理员B(重点是另一个管理员)让他给我拿;

3、我根据管理员A告诉我的位置去找管理员B告诉他我要找一本书【第二次请求】

4、管理员B帮很快帮我找到了书并翻译成我看的懂的文字(HTML)给我(客户端)

 

二、页面跳转

    1、请求转发(HttpServletRequest)

        request.getRequestDispacther("url").forward(request,response);

运用RequestDispatcher接口的Forward()方法 ;forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,只有在客户端没有输出时才可以调用forward方法。<br><br>如果当前页面的缓冲区(buffer)不是空的,那么你在调用forward方法前必须先清空缓冲区。

"/"代表相对与web应用路径

RequestDispatcher rd = request.getRequestDispatcher("/ooo");
rd.forward(request, response);

提交至http://localhost:8080/demo/ooo


RequestDispatcher rd = getServletContext().getRequestDispatcher("/ooo");
rd.forward(request, response);

提交至http://localhost:8080/demo/ooo

 
RequestDispatcher rd =getServletContext().getNamedDispatcher("TestServlet");//(TestServlet为一个<servlet-name>)
rd.forward(request, response);

提交至名为TestServlet的servlet

 

 

    2、重定向(HttpServletResponse)

        response.sendRedirect();

        此方法是在用户的浏览器端工作,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame的jsp文件。

        假设转发代码包含于注册的servlet-url为/demo/test;jsp为/demo/test.jsp。

绝对路径:
response.sendRedirect("http://www.baidu.com")
发送至http://www.baidu.com

根路径:
response.sendRedirect("/aaa")
发送至http://localhost:8080/aaa

相对路径:
response.sendRedirect("aaa")
发送至http://localhost:8080/demo/test/aaa

        绝对路径:response.sendRedirect("http://www.baidu.com")发送至http://www.baidu.com
        根路径:response.sendRedirect("/aaa")发送至http://localhost:8080/aaa
        相对路径:response.sendRedirect("aaa")发送至http://localhost:8080/demo/test/aaa

三、页面间传值

    1、请求转发request

<!--form表单传值-->
<!--传值-->
<form>
 <input name="username"/>
</form>
<!--接值-->
request.getParameter("password"); 
<!--Attribute传值-->  
<!--传值-->  
response.setAttribute("name",name)    
<!--接值-->  
response.getAttribute("name")
<!--URL拼接传值-->
<!--传值-->
url?id=1
<!--接值-->
request.getParameter("id");

 

    2、重定向response

        只能通过URL拼接传值,如:url?id=1

<!--URL拼接传值-->
<!--传值-->
url?id=1
<!--接值-->
request.getParameter("id");

 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值