Servlet中转发和重定向的区别和使用(转载)

 


转载地址:https://blog.csdn.net/weixin_40001125/article/details/88663468

前言:

学习Servlet的一个比较重要的点:那就是“转发(forward)和重定向(redirect)那么它们的区别是什么?

页面的跳转:转发(forward)

转发的方法:

请求对象中常用的方法:

 

 

概念:

  由服务端进行的页面跳转

原理图:

案例

需求

​ 实现从OneServlet中转发到TwoServlet

步骤

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

效果

代码

OneServlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package cn.mixky.servlet_test;
 
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @author zhangzhixi
 * @version 1.0
 * @date 2021-8-17 22:37
 */
@WebServlet(name = "OneServlet", urlPatterns = "/one")
public class OneServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //向请求域中添加键和值
        request.setAttribute("name", "zhixi");
        request.setAttribute("age", 21);
 
        //开始转发,参数是:要跳转到的地址
        request.getRequestDispatcher("/two").forward(request, response);
    }
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

TwoServlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package cn.mixky.servlet_test;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
 
/**
 * @author zhangzhixi
 * @version 1.0
 * @date 2021-8-17 22:48
 */
@WebServlet(name = "TwoServlet.java", urlPatterns = "/two")
public class TwoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("这是Two,从请求域中取出one中的值<br>name:" + request.getAttribute("name") + "<br>");
        out.print("age:" + request.getAttribute("age") + "<br>");
 
    }
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

转发的特点

  • 地址栏不发生变化,显示的是上一个页面的地址
  • 请求次数:只有1次请求
  • 根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
  • 请求域中数据不会丢失
  • 转发使用哪个方法?

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

页面的跳转:重定向(redirect)

概念:

  由浏览器端进行的页面跳转

原理图:

重定向案例

需求

  从OneServlet重定向到TwoServlet

步骤

  1. 在OneServlet中向请求域中添加键和值

  2. 使用重定向到TwoServlet,在TwoServlet中看能否取出请求域的值

效果

 

代码:

需要注意的是,转发是从/当前

重定向的特点

  地址栏:显示新的地址
  请求次数:2次
  根目录:http://localhost:8080/ 没有项目的名字
  请求域中的数据会丢失,因为是2次请求

转发跟重定向的使用场景:

问:什么时候使用转发,什么时候使用重定向?

  答:如果要保留请求域中的数据,使用转发,否则使用重定向。

以后访问数据库,增删改使用重定向,查询使用转发。

问:转发或重定向后续的代码是否还会运行?

  答:重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了

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

posted @   Java小白的搬砖路  阅读(311)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示