Servlet转发、包含、重定向
一、转发
首先创建两个Servlet,RequestServlet1 、RequestServlet2
RequestServlet1
@WebServlet("/request1.do")
public class RequestServlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name", "cs");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/request2.do");
// 转发
requestDispatcher.forward(req, resp);
// 响应
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.print(req.getAttribute("name"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
RequestServlet2
@WebServlet("/request2.do")
public class RequestServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//设置响应的内容的字符集 告诉servlet 响应的时候 将采用UTF-8来响应字符
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.print(req.getAttribute("name"));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
在上面两个Servlet都会在在页面上响应内容
转发
二、将上面转发变为包含
requestDispatcher.include(req, resp);
请求页面,比较上下两张图,可以看出,响应了两次
总结:在请求转发的时候 浏览器只发送了一次请求 而且在响应的时候 第一个servelt的响应将不发挥作用 只有第二个servelt的响应才会被相应给客户
请求包含 也只发送一次请求 但是是将第二个servlet的内容包含到了第一个servlet中 相当于将两个sevlet合并为一个servlet 会将两个servlet中的内容都相应给客
三、重定向
重定向 是浏览器向服务器发送了两次请求 地址栏会发生变化
将HttpServlet1的doPost方法改为
req.setAttribute("name", "cs");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/request2.do");
// 响应
resp.setCharacterEncoding("UTF-8");
resp.sendRedirect("/request2.do");
请求页面
可以看出地址发生了变化,并且页面响应信息为空
转发和重定向的区别
1 转发发送一次请求 重定向发送两次请求
2 转发的时候 地址栏不会发生变化 重定向 地址栏会发生变化
3 转发对两个servlet来说 是同一个请求 所以请求的参数在两个servlet中都可以获取 进行参数的传递
重定向中不能进行参数的传递