一文搞懂转发和重定向

22 篇文章 0 订阅
11 篇文章 0 订阅

在Servlet中实现页面的跳转有两种方式:转发和重定向

如何测试?

能否在OneServlet中保存值到请求域中,在另一个TwoServlet中打印出来?

如果是不同的请求,不能取出来。如果是同一次请求是可以取出来的。

一,转发

服务器端进行的页面跳转

原理图

在这里插入图片描述
转发的方法
在这里插入图片描述

案例

需求:实现从OneServlet中转发到TwoServlet

步骤:

  1. OneServlet向请求域中添加了一个键和值,转发给TwoServlet
  2. TwoServlet就从请求域中取出键和值,打印到浏览器上。

效果:

在这里插入图片描述

代码:

OneServlet.java

/**
 与请求域相关的方法
 */
@WebServlet(name = "OneServlet", urlPatterns = "/one")
public class Demo6OneServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("这是One<br/>");
        //向请求域中添加键和值
        request.setAttribute("name","Jack");
        request.setAttribute("age", 20);  //整数类型
        String name = (String) request.getAttribute("name");
        int age = (int) request.getAttribute("age");
        //从请求域中取出值
        out.print("名字:" + name + "<br/>");
        out.print("年龄:" +  age );
        out.print("<hr/>");
        //删除其中一个
        request.removeAttribute("age");

        //从请求域中取出值,直接输出Object对象
        out.print("名字:" + request.getAttribute("name") + "<br/>");
        out.print("年龄:" +  request.getAttribute("age") );

        //开始转发,参数是:要跳转到的地址
        request.getRequestDispatcher("/two").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

TwoServlet.java

//从请求域中取出值
@WebServlet(name = "TwoServlet", urlPatterns = "/two")
public class Demo7TwoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("这是Two,从请求域中取出one中的值:" + request.getAttribute("name"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

转发使用哪个方法?

request.getRequestDispatcher("/地址").forward(request, response);

 

二,重定向

浏览器端进行的页面跳转

原理图

在这里插入图片描述
重定向方法
在这里插入图片描述

案例:

需求:

从OneServlet重定向到TwoServlet

步骤:

  1. 在OneServlet中向请求域中添加键和值
  2. 使用重定向到TwoServlet,在TwoServlet中看能否取出请求域的值

效果:

在这里插入图片描述

代码

OneServlet.java

/**
 与请求域相关的方法
 */
@WebServlet(name = "OneServlet", urlPatterns = "/one")
public class Demo6OneServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("这是One<br/>");
        //向请求域中添加键和值
        request.setAttribute("name","Jack");
        request.setAttribute("age", 20);  //整数类型
        String name = (String) request.getAttribute("name");
        int age = (int) request.getAttribute("age");
        //从请求域中取出值
        out.print("名字:" + name + "<br/>");
        out.print("年龄:" +  age );
        out.print("<hr/>");
        //删除其中一个
        request.removeAttribute("age");

        //从请求域中取出值,直接输出Object对象
        out.print("名字:" + request.getAttribute("name") + "<br/>");
        out.print("年龄:" +  request.getAttribute("age") );

        //使用重定向
        response.sendRedirect("two");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

TwoServlet.java

//从请求域中取出值
@WebServlet(name = "TwoServlet", urlPatterns = "/two")
public class Demo7TwoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("这是Two,从请求域中取出one中的值:" + request.getAttribute("name"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

 

​​​​​小结:重定向和转发的区别

区别转发forward()重定向sendRedirect()
根目录包含项目访问地址没有项目访问地址
地址栏不会发生变化会发生变化
哪里跳转服务器端进行的跳转浏览器端进行的跳转
请求域中数据不会丢失会丢失

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值