重定向和转发

1.1 重定向

1.1.1重定向的概念

  • 首先客户浏览器发送http请求,当web服务器接受后发送302状态码响应及对应新的location给客户浏览器。
  • 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。

1.1.2 重定向的实现

  • 实现重定向需要借助javax.servlet.http.HttpServletResponse接口中的以下方法:
方法声明 作用
void sendRedirect(String location) 使用指定的重定向位置URL向客户端发送临时重定向响应

1.1.3 重定向的原理

1.1.4 重定向的特点

  • 重定向之后,浏览器地址栏的URL会发生改变。
  • 重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象。
  • 重定向的URL可以是其它项目工程。

1.1.5 代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>重定向跳转</title>
</head>
<body>
<form action="redirectServlet" method="post">
    <input type="submit" value="重定向">
</form>
</body>
</html>

服务端

package cn.guardwhy.demo01;

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;

@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("接收到了浏览器的请求");
        // 1.重定向,给浏览器发送一个新的位置
        response.sendRedirect(request.getContextPath() + "/test01.html");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

页面端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>重定向后的页面</title>
</head>
<body>
    <h3>服务器重新指定位置后的页面</h3>
</body>
</html>

执行结果

1.2 转发

1.2.1 转发的概念

一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,转发
的各个组件会共享Request和Response对象。

1.2.2 转发的实现

  • 绑定数据到Request对象
方法声明 作用
Object getAttribute(String name) 将指定属性值作为对象返回,若给定名称属性不存在,则返回空值。
void setAttribute(String name,Object o) 在此请求中存储属性值。
  • 获取转发器对象
方法声明 作用
RequestDispatcher getRequestDispatcher(String path) 返回一个RequestDispatcher对象,该对象充当位于给定路径上的资源的包装器
  • 转发操作
方法声明 作用
void forward(ServletRequest request, ServletResponse response) 将请求从一个servlet转发到服务器上的另一个资源(Servlet、JSP文件或HTML文件)

1.2.3 转发的特点

  • 转发之后浏览器地址栏的URL不会发生改变。
  • 转发过程中共享Request对象。
  • 转发的URL不可以是其它项目工程。

1.2.4 转发的原理

1.2.5 代码示例

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>转发跳转</title>
</head>
<body>
<form action="forwardServlet01" method="post">
    <input type="submit" value="转发">
</form>
</body>
</html>

服务端

package cn.guardwhy.demo02;

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;

@WebServlet("/forwardServlet01")
public class ForwardServlet01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("接收到了浏览器的请求");
        // 1.向请求域中添加键值对
        request.setAttribute("username", "kobe");
        // 2.转发,也就是让Web组件将任务转交给另外一个Web组件
        request.getRequestDispatcher("/forwardServlet02").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}
package cn.guardwhy.demo02;

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;

@WebServlet("/forwardServlet02")
public class ForwardServlet02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("数据转发过来了");
        // 1.从请求域中取出用户名
        String username = (String) request.getAttribute("username");
        System.out.println("获取的用户名:" + username);
        // 2.设置编码
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("从请求域中取出用户:" + username);
        out.write("<h3>转发成功...</h3>");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

执行结果

1.2.6 重定向和转发的区别

区别 转发forward() 重定向sendRedirect()
地址栏 不会变化 会显示新的地址
哪里跳转 服务器端 浏览器端
请求域中数据 不会丢失 会丢失
根目录 http://localhost:8080/项目名 http://localhost:8080
posted @ 2021-10-28 18:33  guardwhy  阅读(292)  评论(0编辑  收藏  举报