转发和重定向
文章目录
- 转发和重定向
- 1、转发
- 2、重定向
- 3、俩者的异同
1、转发
请求转发就是将浏览器发送给服务器的响应 转发给其他的servlet或jsp,本质上 还是同一个请求,相当于 浏览器只访问了一次。
如上图,浏览器只进行一次对服务器的请求,而在容器中,请求和响应被发送给其他的servlet
转发的特点:
- 转发是 一个请求响应,但是会涉及俩次,可以做 数据的共享
- 转发的浏览器 地址不会发生变化
- 由于 是一次请求和响应,所以 请求和响应会共享
常用的方法:
• 请求绑定数据
request.setAttribute("参数名",参数对象);
• 转发调度器
RequestDispatcher rd = res.getRequestDispatcher("/main");
• 转发
// forward里面的参数还是浏览器传入的请求和响应
rd.forward(resquest,response);
• 获取转发绑定的数据
req.getAttribute("参数名");
案例:
• 第一个servlet
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求编码
req.setCharacterEncoding("utf-8");
// 请求绑定参数
req.setAttribute("msg","这是第一个servlet绑定的数据");
// 请求转发到第二个servlet
req.getRequestDispatcher("/second").forward(req,resp);
}
}
• 第二个servlet
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获得第一个servlet请求绑定的数据
String msg = (String) req.getAttribute("msg");
// 页面打印
// 设置响应类型
resp.setContentType("text/html;charset=utf-8");
// 输出到页面
PrintWriter writer = resp.getWriter();
writer.println("这是第二个servlet,这是数据:"+msg);
writer.close();
}
}
- 结果
通过结果可以看出,我们的页面是第二个页面,确实获得了第一个servlet的参数,而且浏览器的地址还是first
2、重定向
重定向就是一个请求和响应只对应了一个servlet,servlet响应给浏览器,浏览器发送一个新的请求给另一个servlet,本质上是俩个请求,浏览器发送了俩次请求和响应
如上图,客户端先访问了servlet1,然后servlet1响应给客户端,应该去找servlet2,然后浏览器又向servlet2发送了请求
重定向的特点:
- 客户端 发送了俩次请求,不可以通过请求做数据的共享
- 浏览器的 地址会改变,会变为servlet2的地址
重定向方法:
// 响应给浏览器一个新的请求 ressponse.sendRedirect("main.jsp");
案例:
• 第一个servlet
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 响应给第二个servlet
resp.sendRedirect("second");
}
}
• 第二个servlet
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 页面打印
// 设置响应类型
resp.setContentType("text/html;charset=utf-8");
// 输出到页面
PrintWriter writer = resp.getWriter();
writer.println("这是第二个servlet");
writer.close();
}
}
- 结果
访问的first,浏览器的地址改变了
3、俩者的异同
相同点:
- 都对页面进行了跳转
不同点:
- 请求次数:转发时一次请求,重定向时俩次
- 转发2个servlet共用的是同一个request和response,可以通过request传递参数,但是重定向不能使用response传递参数
- 转发浏览器地址不会变,重定向会改变浏览器地址