128-请求转发和请求包含

20 篇文章 0 订阅
8 篇文章 0 订阅


请求转发和请求包含

在说这两个东西之前
我想说一下
请求转发和重定向的区别


请求转发----重定向 区别
1.请求转发是1个请求,也就是A把请求直接给了B
	重定向是2个请求,A收到请求,再向B发一个请求

2.请求转发只能是一种请求方式,GET或者POST
	重定向的第二个请求一定是GET

3.请求转发的地址栏不会发生变化,
	重定向的地址会变化,因为是两个请求

4.请求转发只能在本应用中
	重定向可以跨应用,比如可以直接重定向到百度




现在来说一下请求转发和请求包含

请求转发
请求转发是由下一个Servlet来完成相应体
当前的Servlet只能设置响应头
这叫做 留头不留体

请求包含
由两个Servlet共同完成相应体
这叫做 留头也留体


无论是请求转发还是请求包含
都是在一个请求范围内,也就是说 是1个请求
使用的是同一个request 和 response


我们来两个Servlet来演示一下这两个东西

public class OneServlet extends BaseServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求头
        response.setHeader("name", "Alice");
        //设置请求体
        response.getWriter().print("OneServlet...");
        //请求转发
        request.getRequestDispatcher("/two").forward(request, response);
    }
}


public class TwoServlet extends BaseServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求体
        response.getWriter().print("TwoServlet...");
    }
}


然后我们配置一下one和two

  <servlet>
    <servlet-name>oneServlet</servlet-name>
    <servlet-class>user.servlet.OneServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>twoServlet</servlet-name>
    <servlet-class>user.servlet.TwoServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>oneServlet</servlet-name>
    <url-pattern>/one</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>twoServlet</servlet-name>
    <url-pattern>/two</url-pattern>
  </servlet-mapping>


然后运行一下,我们访问/one路径
我们发现 setHeader成功了
页面上显示的是 TwoServlet...
所以
One设置请求体成功
然后把请求转发给Two
Two的请求体生效
One的请求体是无效的

这就是请求转发





我们再来看请求包含

我们把One的forward方法
改成include
其他的都不用改

public class OneServlet extends BaseServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求头
        response.setHeader("name", "Alice");
        //设置请求体
        response.getWriter().print("OneServlet...");
        //请求转发
        request.getRequestDispatcher("/two").include(request, response);
    }
}

public class TwoServlet extends BaseServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求体
        response.getWriter().print("TwoServlet...");
    }
}

然后运行之后
我们发现页面上显示的是
OneServlet...TwoServlet...

也就是说One和Two的print都成功执行了
两者的请求体都接收到了

这就是请求包含
两者的请求体都保留了
include 请求包含


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值