目录
请求转发(Forward)
A想找B借10块钱,B只有5块,于是B找C借了5块,然后将10块钱借给了A。(A只知道钱是B借给他的,不知道C参与了其中)
请求转发是.forword()方法;作用:在服务器端内部将请求转发给另一个资源,浏览器只知道发出请求并得到响应结果,但不知道在服务器程序内部发生了转发行为。
重定向(Redirect)
A想找B借10块钱,B没钱,于是B让A去找C借钱,于是A听B的话去找了C,C借给了A。(A去找B借了一次,去找C借了一次,是B让A去找C的)
重定向是.sendRedirect()方法;作用:是对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。
请求转发与重定向的比较:
请求转发:客户端浏览器的URL地址不会发生变化,仍然是最初的URL。请求在服务端完成处理,服务端直接将响应返回给客户端。请求在服务端完成,页面加载时间相对较快。
重定向:客户端浏览器的URL地址会发生变化,变为跳转到的新URL。服务端会向客户端发送一个HTTP 302状态码,告知客户端重新请求新的 URL。客户端收到302后会自动向新的URL发起请求。需要客户端重新发起请求,页面加载时间相对较慢。
总结
请求转发:服务端的行为,地址栏不会改变,只有一个请求,request当中的数据在servlet程序中共享,转发的地址只能是网站内的资源
重定向:客户端的行为,地址栏发生改变,有两个请求,request中的数据不共享,重定向可以转发到任意地址(可以跨域)
测试代码
s01.java
@WebServlet("/s01")
public class s01 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public s01() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("s01");
/*
String username = request.getParameter("username");
String password = request.getParameter("password");
request.getRequestDispatcher("s02").forward(request,response);
System.out.println("s01 "+"账号:"+username+"密码:"+password);*/
//(页面网址 http://localhost:8080/2222222222222/s01?username=admin&password=123456
// 请求转发
//请求跳转到servlet02
//request.getRequestDispatcher("s02").forward(request,response);
//请求跳转到页面
//request.getRequestDispatcher("content.html").forward(request,response);
//请求跳转到WEB-INF的页面
//request.getRequestDispatcher("WEB-INF/test.html").forward(request,response);
//服务端的行为,地址栏不会改变,只有一个请求,request当中的数据在servlet程序中共享,转发的地址只能是网站内的资源,不可以转发到百度
//重定向到s02
//response.sendRedirect("s02");
//response.sendRedirect("content.html");
//不可以重定向到WEB-INF下的页面 (404)
//response.sendRedirect("WEB-INF/test.html");
//response.sendRedirect("https://www.baidu.com/");
//客户端的行为,地址栏发生改变,有两个请求,request中的数据不共享,重定向可以转发到任意地址(可以跨域)
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
s02.java
@WebServlet("/s02")
public class s02 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public s02() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("s02");
/*
String username = request.getParameter("username");
String password = request.getParameter("password");
request.getRequestDispatcher("s02").forward(request,response);
System.out.println("s02 "+"账号:"+username+"密码:"+password);*/
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
将注释取消掉,用我上边这两个java文件s01.java和s02.java的代码进行测试。