请求重定向与请求转发

来源:互联网 发布:淘宝直播怎么做起来 编辑:程序博客网 时间:2024/06/14 23:24

相信很多刚开始接触jsp的同学会搞不清楚请求重定向和请求转发的区别,这里首先举个栗子~~

假设你去办理某个护照

重定向:你去了A局,A局的人说:“这个事不归我们管,你们应该去B局”,然后,你就从A局退了出来,自己又跑了一趟B局。

请求转发:你去了A局,A局看了以后,知道这个事情应该归B局来管,但是他没有把你的请求退回来,而是让你坐一会,然后A局到后面自己联系了B局的人,把该事情转手给B局人来 办,让他们办好以后送回A局,然后你的护照就办理好了。


          分析上面的例子,你是客户端,你要办理护照,这是一个request请求,在重定向中,请求页面是A局,然后A局给你个response,让你自己再去请求B局,这个时候你自己又发送 了一次请 求,只不过这次是请求B局,这个重定向是你自己即客户端的行为,并且是两次http请求,第一次的请求对象并不会保存。

          而在请求转发中,你仍然是客户端,但是你只发送一次请求,就是向A局发送了一次http请求,虽然A局自身不能处理你的请求,但是A局把你的request请求对象 转发给了B局,交给B局来处理,然后再由A局把结果返回给你,这样你作为客户端就只有一次请求,请求转发是服务器的行为,而且请求转发是携带请求对象,并且在客户端看来,仿佛是A局处理了你请求。


所以,总结一下就是:

           请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变

           请求转发:服务器端行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发请求后对象会保存,地址栏的URL地址不会改变。


下面我们来做个小小的测试

          我们写三个jsp页面,一个是register.jsp注册页面,里面有个表单,把用户名密码提交到handler1,jsp处理页面。

         

<form action="handler1.jsp" method="post">  用户名:<input type="text" name="admin"/>    密码:     <input type="password" name="pswd" /> <button type="submit">注册</button></form>
       然而,handle1.jsp页面并不能处理该请求,所以你打算在handle1.jsp里面进行请求重定向,打算把它交给handler2.jsp进行处理,于是你写了handler1.jsp是这么写的

     

<%    request.setCharacterEncoding("utf-8");   response.sendRedirect("handler2.jsp");%>
   那么你的handler2.jsp是这么写的

   

<%      String admin = request.getParameter("admin");   String pswd = request.getParameter("pswd");%>欢迎您,您已注册成功!!用户名:<%=admin %>密码:<%=pswd %>

      于是你在register.jsp上填写表单点击注册按钮, 你希望的结果是handler2.jsp能够处理你的请求,在页面上显示“欢迎您……用户名:张三,秘密:666”,然后结果却是

      “欢迎您,注册成功,用户名:null  密码:null”

第一张图片

同时,你会纳闷,为什么在handler2.jsp中获取不到我的request请求对象 呢???其实,原因很简单,当你发送请求至handler1.jsp,它返回给你302,告诉你重定向到handler2.jsp,于是你又发送一遍请求给handler2.jsp,之前的请求对象根本就没有传递过去。。同时,你也可以在浏览器调试工具中看到,其实是两次请求

     

所以正确的做法修改handler1.jsp,用请求转发的方式。

<%    request.setCharacterEncoding("utf-8");   request.getRequestDispatcher("handler2.jsp").forward(request, response);%>

这样,你再运行试试就可以得到你想要的结果,你会看到“欢迎您,您已注册成功!! 用户名:张三 密码:123"


同时你观察浏览器调试工具中,会发现确实是一次请求。



                     

1 0
原创粉丝点击