• 20160326 javaweb 请求转发和请求包含


    (1)请求转发:
    this.getServletContext().getRequestDispatcher("").forward(request,response);
    request.getRequestDispatcher("").forward(request,response);

    ~请求转发是希望将请求交给另外一个资源执行,所以应该保证只有最后真正要执行的资源才能够输出数据,所以:

    *请求转发时,如果已经有数据被写入到了response的缓冲区,但是这些数据还没有被发送到客户端,则请求转发时,这些数据将会被清空.但是清空的只是响应中的实体内容部分,头信息并不会被清空.

    Demo5:

    Demo6:


    *而请求转发时已经有数据被打给了浏览器,那么再进行请求转发,不能成功,会抛出异常,原因是响应已经结束了,再转发交给其他人没意义了

    修改Demo5:


    *在最终输出数据的Servlet执行完成后,response实体内容中的数据将会被设置为已提交的状态,再往里写数据也不会起作用

    -------使用以上三条,就保证了最终只有一个Servlet能够向浏览器输出数据,所以

    *一个Servlet里两次请求转发也是不可以的,一次请求交给两人处理自然也是不行.

    另外 千万不要做循环的转发,比如从Demo5转发到Demo6,再从Demo6转发到Demo5,会造成不停的循环异常

    (2)请求包含:将两个资源的输出进行合并后输出
    this.getServletContext().getRequestDispatcher("").include(request,response);
    request.getRequestDispatcher("").include(request,response);

    *被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略


    *常被用来进行页面布局

    (3)三种资源处理方式的区别
    请求重定向
    response.sendRedirect();
    请求转发
    request.getRequestDispatcher().forward();
    请求包含
    request.getRequestDispatcher().include();


    请求重定向和请求转发的区别:
    请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
    请求重定向两次请求两次响应.请求转发一次请求一次响应.

    如果需要在资源跳转时利用request域传递域属性则必须使用请求转发
    如果希望资源跳转后修改用户的地址栏则使用请求重定向
    如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力.

  • 相关阅读:
    WINFORM实现进程信息的查看,listview,点击,右键,右键菜单
    VFP 实验参考答案
    C++ 大作业 超市收银系统
    ASP实现计算机爱好者网站,可以直接浏览
    C语言实验单片机串口发送int型数据
    超声波 HC-SR04
    django应用之corsheaders[跨域设置]
    git
    Your activation code could not be validated(error 1653219)
    Django Rest Framework简介及初步使用
  • 原文地址:https://www.cnblogs.com/xiaoduc-org/p/5324047.html
Copyright © 2020-2023  润新知