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

来源:互联网 发布:忘记wi-fi网络连接密码 编辑:程序博客网 时间:2024/06/07 04:07

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域传递域属性则必须使用请求转发
                如果希望资源跳转后修改用户的地址栏则使用请求重定向
                如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力.

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚出生几天的宝宝拉肚子怎么办 刚出生的宝宝拉肚子怎么办 出生八天的宝宝拉肚子怎么办 刚出生婴儿拉水怎么办 三岁宝宝一直吐怎么办 3岁宝宝一直吐怎么办 5个月宝宝一直吐怎么办 新生儿睡反了觉怎么办 吃母乳奶流量大怎么办 两个月宝宝有痰怎么办 婴儿瞌睡睡倒了怎么办 侧切伤口崩开了怎么办 脐带30天未脱落怎么办 洗眉结痂不掉怎么办 新生宝宝生殖器下面破皮怎么办 脐带未脱落渗血怎么办 车停店门口贴发单怎么办 有人要打我我该怎么办 很笨怎么办工作做不好 脸被电焊烤了疼怎么办 脸过敏痒的不行怎么办 领导想让你辞职怎么办 领导强吻我了怎么办 赫曼夏天温度高怎么办 近视看3d电影怎么办 有声挂图撕坏了怎么办 主机没有放光盘的设备怎么办 装显卡是没光驱怎么办 电脑机箱光盘总是出来怎么办 看书网作者密码忘记怎么办 电脑光驱访问出现出错怎么办 电脑不读dvd光盘怎么办 dvd光盘读不出来怎么办 光盘插在电脑里出不来怎么办 cad画斜线不光滑怎么办 ps没有魔棒工具怎么办 洗完鞋子发黄了怎么办 牛拜单车不退押金怎么办 总裁太爱我怎么办小说 小班走丢了怎么办ppt 走丢了怎么办 教案 ppt