重定向和转发(完整理解及总结)

目录

1.重定向

1.1重定向是什么

1.2重定向的特征

1.3重定向核心代码

1.4重定向实例演示

1.4.1书写login.jsp

1.4.2继承HttpServlet

1.4.3配置web.xml

1.4.4创建main.jsp

1.4.5测试

2.转发

2.1转发是什么

2.2转发的特征

2.3转发的核心代码

2.4转发实例演示

2.4.1书写login.jsp

2.4.2继承HttpServlet

2.4.3配置web.xml

2.4.4创建main.jsp

2.4.5测试

3.重定向和转发的区别

3.1定义不同

3.2跳转方式不同

3.3数据共享不同

3.4最终URL地址不同

3.5代码实现不同


web网站上面有一些跳转按钮。比如登录成功以后跳转到主页面!!!

1.重定向

1.1重定向是什么

用户通过浏览器发送一个请求,Tomcat服务器接收这个请求,会给浏览器发送一个状态码302,并设置一个重定向的路径,浏览器如果接收到了这个302的状态码以后,就会去自动加载服务器设置的路径

一个页面跳转到另外一个页面(应用场景)、登录页面跳转到主页面: login.jsp====>LoginServlet====>main.jsp

1.2重定向的特征

①重定向的过程是浏览器(客户端)的行为

②实际上浏览器做了2次请求(当点击登录按钮的时候做了两次请求)(分别是请求login和main.jsp)

③注意上一次请求的request对象会丢失

④重定向有一个非常明显的特征,即浏览器的url变化了

1.3重定向核心代码

复制代码
response.sendRedirect("main.jsp"); //就这一行代码,但是这一行代码必须写在doGet或者doPost方法中

1.4重定向实例演示

1.4.1书写login.jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求RedirectServlet--%>
<form action="redirect" method="post">
    <input type="text" name="username"/><br>
    <input type="text" name="password"/><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

1.4.2继承HttpServlet

复制代码
package com.by.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符编码
        request.setCharacterEncoding("utf-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        request.setAttribute("username", username);
        request.setAttribute("password", password);

        //登录以后跳转到主页
        //重定向
        //这个TestLoginServlet里面的数据是不能传给target.html的
        response.sendRedirect("main.jsp");
    }
}

1.4.3配置web.xml

复制代码
 <servlet>
        <servlet-name>redirect</servlet-name>
        <servlet-class>com.by.servlet.RedirectServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>redirect</servlet-name>
        <url-pattern>/redirect</url-pattern>
    </servlet-mapping>

1.4.4创建main.jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这是main页面<br>
<%--
<%=request.getAttribute("username")%>
<%=request.getAttribute("password")%>
--%>

${username}
${password}
</body>
</html>

这里<%=request.getAttribute("username")%>与${username}是相同的,都是接受参数。

1.4.5测试

跳转后:

main.jap接收不到index.jap的参数

2.转发

2.1转发是什么

用户发送数据请求到服务器,服务器接收当前请求,会调用内部方式(转发)处理该请求,最终把响应给客户端

2.2转发的特征

①转发是服务器的行为

②浏览器在这个过程中只有一次行为

③转发可以带有数据 request对象中

④url不会发生任何的变化

2.3转发的核心代码

复制代码
request.getRequestDispatcher("main.jsp").forward(request,response);
//这一行代码就表示进行了转发,url没有变,但是响应的结果却是一次请求干了两个活

2.4转发实例演示

2.4.1书写login.jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求ForwardServlet--%>
<form action="forward" method="post">
    <input type="text" name="username"/><br>
    <input type="text" name="password"/><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

2.4.2继承HttpServlet

复制代码
package com.by.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ForwardServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符编码
        request.setCharacterEncoding("utf-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        request.setAttribute("username", username);
        request.setAttribute("password", password);

        //登录以后跳转到主页
        //重定向
        //这个TestLoginServlet里面的数据是不能传给target.html的
        request.getRequestDispatcher("main.jsp").forward(request, response);
    }
}

2.4.3配置web.xml

复制代码
  <servlet>
        <servlet-name>forward</servlet-name>
        <servlet-class>com.by.servlet.ForwardServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>forward</servlet-name>
        <url-pattern>/forward</url-pattern>
    </servlet-mapping>

2.4.4创建main.jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这是main页面<br>
${username}
${password}
</body>
</html>

2.4.5测试

结果:

main.jap可以接受到index.jsp的数据

3.重定向和转发的区别

  1. 定义不同
  2. 跳转方不同
  3. 数据共享不同
  4. 最终 URL 地址不同
  5. 代码实现不同

3.1定义不同

请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向

请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端。而客户端对于这一切毫无感知的。

3.2跳转方式不同

请求重定向是客户端的行为,而请求转发是服务器端的行为,服务器端代替客户端发送请求,并将结果返回给客户端。

3.3数据共享不同

请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。

请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的。

3.4最终URL地址不同

请求重定向是服务器端告诉客户端,"你去另一个地访问去",所以浏览器会重新再发送一次请求,因此客户端最终显示的 URL 也为最终跳转的地址,而非刚开始请求的地址,所以 URL 地址发生了改变。

请求转发是服务器端代为请求,再将结果返回给客户端的,所以整个请求的过程中 URL 地址是不变的。

3.5代码实现不同

请求重定向的实现代码如下:

复制代码
@RequestMapping("/rt")
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.sendRedirect("/index.html");
}

请求转发的实现代码如下:

复制代码
@RequestMapping("/fw")
public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/index.html").forward(request, response);
}
相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦6 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚6 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-6 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-6 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白7 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司8 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地9 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun3141599 小时前
TCP超时重传机制是为了解决什么问题?
java
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化