一篇文章教你了解 请求转发与重定向

目录

请求转发(Forward)

重定向(Redirect)

请求转发与重定向的比较:

总结

测试代码


请求转发(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的代码进行测试。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值