请求转发(Forward)
请求转发(Forward):这里的“请求”是名词,请求转发指客户端浏览器向Web服务器端发送请求,服务器端收到请求后进行相应处理后再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的),服务器端对该资源进行处理后反馈给客户端。
下边用代码具体说明请求转发
1,在浏览器端访问如下文件
执行结果如下:
2,点击上述结果中的连接a标签,客户端浏览器发送请求给服务器端,服务器端开始处理。
3,如下代码将请求转发到1.jsp文件,在1.jsp中获取值,值返回到服务器端,服务器端再传回到客户浏览器端。
request.getRequestDispatcher("1.jsp").forward(request, response); //请求转发,再将结果返回。
得到执行结果如下:
注意:因为是服务器端收到请求后进行相应处理,再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的),服务器端对该资源进行处理后反馈给客户端,所以路径为服务器端。
重定向(Redirect)
重定向(Redirect):客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。
1,先在客户端浏览器访问如下jsp文件
结果如下
2,点击连接,客户端向web服务器端发送请求,服务器端响应
package com.jd.zzu;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("key", "2000");
response.sendRedirect("1.jsp");//重定向
}
}
服务器端处理如下代码,
response.sendRedirect("1.jsp");
返回如下信息给客户端浏览器:
由于是客户端浏览器重新发送请求,所以地址栏url改变,又因为不是同一个请求,所以得到的值为null。
重定向与请求转发的区别:
1、重定向:当客户端向服务器发送一个请求,请求地址发生了变化,服务器向客户端返回了一个继续处理的新地址,此时客户端自动(不需要人工参与)访问服务器的新地址,服务器将新地址的内容返回给客户端。采用重定向的方式进行处理,客户端和服务器端共执行了两次请求和两次响应,且浏览器地址栏显示的是第二次访问的新地址。
请求转发:客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。采用请求转发的方式,客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
2、请求转发方式处理页面跳转,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源,而重定向没有这个限制。
如下例子:
说明:NewFile.jsp和1.jsp文件中代码同上
请求转发得到如下结果:
重定向:NewFile.jsp和1.jsp文件中代码同上
3、重定向无法再新的页面获取request.setAttribute中保存的数据,请求转发可以。
此处参照前边分别讨论的内容:请求转发返回的是获得的值2000,重定向返回的是null。
4、Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取。
第一步:先将1.jsp文件移动到WEB-INF安全目录下。
第二步:1.jsp文件,NewFile.jsp文件中的代码参考重定向和请求转发。
重定向:
得到如下结果:
请求转发:
得到如下结果: