请求转发和请求包含
在说这两个东西之前
我想说一下
请求转发和重定向的区别
请求转发----重定向 区别
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 请求包含