转发和重定向

转发和重定向

转发使用的方法

使用请求调度器 RequestDispatcher对象调用faward(request, response)实现,如何获得 RequestDispatcher对象?可以使用request调用 getRequestDispatcher("转发页面的路径") 获得。
一个完整的转发例子

RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
rd.faward(request, response);

重定向使用的方法

使用对象response调用sendRedirect(String location)实现重定向操作
具体代码是:

response.sendRedirect(重定向的页面);

谈一谈转发和重定向的区别:

转发不会导致客户端的地址栏请求(URL)变化,重定向会导致客户端URL变化。

Servlet转发到JSP页面或是Servlet后,被转发的JSP页面或是Servlet可以使用request.getAttribute()获得转发页面中request对象中存储的数据。Servlet重定向到JSP页面或是Servlet后,被重定向的JSO页面或是Servlet不能使用request.getAttribute()获得重定向页面request对象中存储的数据。

什么造成了转发和重定向的区别?

在HTTP协议中,客户端发送一个HTTP请求给服务器,服务器处理后返回给客户端一个HTTP响应。Servlet使用的就是HTTP协议。

转发: 客户端发送请求给服务器端,服务器端处理请求,服务器将请求转发给当前应用可以接收的页面或者Servlet,也就是说,不能转发到不属于当前应用处理不了的请求,要不然就404了。举个例子,客户端发送请求,请求的是Servlet1,Servlet1可能处理不了,就把请求转发到了Servlet2,Servlet2处理请求后返回给客户端一个页面。在这个过程中,用户客户端发送请求后一直在等待服务器返回响应,等待过程中是不知道请求的Servlet1把请求转发给了Servlet2,服务器端这时还没有给客户端任何响应,客户端的地址栏是请求的窗口,可以从地址栏中看到客户端发送给服务器端的请求,由于客户端的请求没变,所以看到的地址栏信息是不变的。转发是在客户端一次请求中完成的,所以被转发的JSP页面或者Servlet可以共享转发Servlet的请求数据。当被转发的需要获得请求中存储的数据时,需要使用的方法是String getParameter()和Object getAttribute(),说说getParameter()和getAttribute()的区别吧。当客户端发送请求时,请求中就带了数据,比如在提交表单时表单字段就会和请求一起被发送到服务器端,这个从客户端来的数据在服务器端使用getParameter()方法获得值,由于是客户端发送过来的数据,所以在服务器端不能修改只能查看,否则只能让客户端再发送一个请求,也就是说没有setParameter()。下面来讲getAttribute(),从客户端发来的数据不能使用getAttribute()获得,但是服务器中可以让请求对象存储一些数据,方便在转发的时候让被转发的JSP页面或者Servlet共享这些数据。举个例子,客户端发送请求,请求的是Servlet1,在Servlet1中,把数据存储在请求对象中,使用的代码是request.setAttribute("Test", "HelloWorld");意思是存储了一个键值对在request中,方法规定键是String类型,值是Object类型。我们这里将String类型的对象"HelloWorld"赋值给Object类型的参数,是子类对象赋值给父类对象,下转上,自动转换。Servlet1将客户端发来的请求转发给Servlet2,Servlet2可以使用getParameter()获得客户端发来的数据,也可以使用getAttribute()获得Servlet1存储在请求中的键值对数据。所以转发可以共享一个HTTP请求的数据。

重定向:重定向方法sendRedirect()的使用者是response,response是服务器响应对象,所以使用重定向时,意味着服务器响应了一次客户端请求,这样的话,之前客户端请求的生命周期就过了,服务器如果在使用getParameter()或者getAttribute()就和之前的请求对象没有关系了(之前的请求对象消失了,数据也没有了)。重定向就是服务器端发送一个HTTP响应告诉客户端,再发送一个HTTP请求到XXXX,所以客户端的地址栏会发生改变。

posted on 2021-11-23 13:14  小白成长变大神  阅读(80)  评论(0编辑  收藏  举报