菜鸟学Android笔记(三十四):实现请求转发和请求包含

1、什么是请求转发?

指将原页面的request,response对象传入新的页面,这样新旧页面拥有相同的request和response对象,一次请求一次响应

两种常见的请求转发的语句:

this.getServletContext().getRequestDispatcher("").forward(request,response);
request.getRequestDispatcher("").forward(request,response);

下面实现如何从Demo7转发到Demo8

Demo7的代码

package com.java.request;

import java.io.File;
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 Demo7 extends HttpServlet{
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		response.getWriter().write("from demo7");
		request.getRequestDispatcher("/java/request/Demo8").forward(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		doGet(request, response);
	}
	

}

Demo8的代码

package com.java.request;

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 Demo8 extends HttpServlet{
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		response.getWriter().write("from demo8");
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		doGet(request, response);
	}
	

}
注意:

请求转发是希望将请求交给另外一个资源执行,所以应该保证只有最后真正要执行的资源才能够输出数据,所以:
               
 *请求转发时,如果已经有数据被写入到了response的缓冲区,但是这些数据还没有被发送到客户端,则请求转发时,这些数据将会被清空.但是清空的只是响应中的实体内容部分,头信息并不会被清空.
 *而请求转发时已经有数据被打给了浏览器,那么再进行请求转发,不能成功,会抛出异常,原因是响应已经结束了,再转发交给其他人没意义了
*在最终输出数据的Servlet执行完成后,response实体内容中的数据将会被设置为已提交的状态,再往里写数据也不会起作用            
-------使用以上三条,就保证了最终只有一个Servlet能够向浏览器输出数据,所以            
 *一个Servlet里两次请求转发也是不可以的,一次请求交给两人处理自然也是不行.

这是什么意思?

我的理解是:

1、假如这一行代码后面还有另一行代码:

request.getRequestDispatcher("/java/request/Demo8").forward(request, response);
request.getRequestDispatcher("index.jsp").forward(request, response);
这样是会报错的,因为他违反了一次请求一次响应的原则

2、下面Demo7的代码是不会显示的浏览器的,因为他已经被清空了

response.getWriter().write("from demo7");

二、什么是请求包含

从上面的最后一条,可以看出,有些数据已经被清空了,但我们希望它能够一起输出来,这就需要请求包含了

将下面的改为:

request.getRequestDispatcher("/java/request/Demo8").forward(request, response);

request.getRequestDispatcher("/java/request/Demo8").include(request, response);

这个时候就会输出:

from demo7  from demo8

这有什么作用呢?听说是用于页面布局?嘿嘿,我也没学到,可以继续看下去

三、请求转发和请求重定向

下面的区别是抄的,先看看,还没有消化:

 三种资源处理方式的区别
            请求重定向
                response.sendRedirect();
            请求转发
                request.getRequestDispatcher().forward();
            请求包含
                request.getRequestDispatcher().include();
                
                
            请求重定向和请求转发的区别:
                请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
                请求重定向两次请求两次响应.请求转发一次请求一次响应.
                
                如果需要在资源跳转时利用request域传递域属性则必须使用请求转发
                如果希望资源跳转后修改用户的地址栏则使用请求重定向
                如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值