转发与请求重定向的区别

         在servlet中经常用到转发和请求重定向,在不清楚区别的时候两者经常用错,为此在这里将作出稍微的解释。

1.转发

(1)首先画出相关的图解来解释说明该过程


由上面的图可以知道,浏览器只发送一次请求,转发由服务器完成。可以形象描述为:servletDemo01无法完成某一件事,它request让servletDemo02完成


(2)用Java代码来实现上面过程

在ServletDemo01中

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		String str="aaaaaa";
		
		System.out.println("A:我想喝杯水");
		System.out.println("B:我现在在忙,让C(ServletDemo02)干吧");
		
		request.getRequestDispatcher("/servlet/demo02").forward(request, response);
		System.out.println("B:给你水");
	}


在ServletDemo02中

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("C:我马上帮你倒杯水");
	}


在控制台得到的结果为:

结合上面的图很容易理解这个过程,及ServletDemo02将结果放回给ServletDemo01


2.请求重定向

(1)首先画出相关的图解来解释说明该过程


由上面的图可以知道,浏览器发送两次次请求,由浏览器完成。可以形象描述为:servletDemo05无法完成某一件事,它指示浏览器去访问servletDemo06可以完成


(2)用Java代码来实现上面过程

在ServletDemo05中血下面的代码

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("A:我要借钱");
		System.out.println("B:我没有,但是我知道谁有");
		response.setStatus(302);
		response.setHeader("location", "/ee10_request_response/servlet/ServletDemo06");
		System.out.println("A:我去了");
	}


在ServletDemo07中代码为

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("C:我有钱");
	}


最后得到的结果为:


细节分析:

①在上面的代码执行顺序来看,首先执行的是ServletDemo05里面的全部内容,其次再是ServletDemo06 的内容,这一点可以通过其执行顺序为:ServletDemo05——浏览器------ServletDemo06。

②由于转发重定向是发生在浏览器,所以在写转发的URL时要注意:该URL地址必须是项目名称+URI地址


(3)请求重定向简写

可以使用response.sendRedirect();来实现

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("A:我要借钱");
		System.out.println("B:我没有,但是我知道谁有");
		//response.setStatus(302);
		//response.setHeader("location", "/ee10_request_response/servlet/ServletDemo07");
		response.sendRedirect("/ee10_request_response/servlet/ServletDemo07");
		System.out.println("A:我去了");
	}


3.转发与请求重定向的区别

(1)区别1:转发:客户端只发送一次请求

              请求重定向:客户端请求两次


(2)区别2:转发:地址栏不变

      请求重定向:地址栏发生变化,例如上面的例子中,地址栏由localhost:8080/ee10_request_response/servlet/ServletDemo05变成localhost:8080/ee10_request_response/servlet/ServletDemo06


(3)区别3:转发:能够传递数据

     请求重定向:不能传递数据

看下面的例子:

转发:能够传递数据

新建一个ServletDemo06,使用setAttribute(key,value)方法

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("A:我想办事");
		System.out.println("B:我办不了,但我可以找人帮你办");
		
		String str="aaa";
		//1.将表单的数据添加到request域中
		request.setAttribute("s", str);
		//2.1使用转发
		request.getRequestDispatcher("/servlet/ServletDemo07").forward(request, response);
		
		System.out.println("B:事办完了");
	}

在ServletDemo07中,使用getAttribute(key,value)方法

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("C:我有办");
		
		//获取request域中的对象
		String attribute = (String) request.getAttribute("s");
		System.out.println(attribute);
	}

得到的结果为:



请求重定向:不能传递数据

在ServletDemo06中写一下代码

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("A:我想办事");
		System.out.println("B:我办不了,但我可以找人帮你办");
		
		String str="aaa";
		//1.将表单的数据添加到request域中
		request.setAttribute("s", str);
		//2.2请求重定向
		response.sendRedirect("/ee10_request_response/servlet/ServletDemo07");
		
		System.out.println("B:事办完了");
	}

保持ServletDemo07不变

得到结果为:



故由上面的结论可以得到;利用请求重定向不能数据传递

(4)区别4:转发:不能跳到其他应用

请求重定向:可以跳转到其他应用

利用转发:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("A:我想办事");
		System.out.println("B:我办不了,但我可以找人帮你办");
		
		String str="aaa";
		//1.将表单的数据添加到request域中
		request.setAttribute("s", str);
		//2.1使用转发
		request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
		System.out.println("B:事办完了");
	}

得到的结果为:



利用请求重定向:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("A:我想办事");
		System.out.println("B:我办不了,但我可以找人帮你办");
		
		String str="aaa";
		//1.将表单的数据添加到request域中
		request.setAttribute("s", str);
		//2.1使用转发
		//request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
		//2.2请求重定向
		response.sendRedirect("http://www.baidu.com");
		System.out.println("B:事办完了");
	}
得到的结果为:

上面的结果也不难想象,因为转发是发生在服务器内部,塔只会去找服务器内部的内容,而请求重定向发生在客户端浏览器,相当于浏览器再次书如百度的地址。


4.总结

以上便是对于转发和请求重定向的较浅理解,如有错误,请提出,谢谢!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值