转发和重定向


文章目录

  • 转发和重定向
  • 1、转发
  • 2、重定向
  • 3、俩者的异同


1、转发


请求转发就是将浏览器发送给服务器的响应 转发给其他的servlet或jsp,本质上 还是同一个请求,相当于 浏览器只访问了一次

java 重定向本地地址 javaweb重定向_ide

如上图,浏览器只进行一次对服务器的请求,而在容器中,请求和响应被发送给其他的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本质上是俩个请求,浏览器发送了俩次请求和响应

java 重定向本地地址 javaweb重定向_数据_02

如上图,客户端先访问了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传递参数
  • 转发浏览器地址不会变,重定向会改变浏览器地址