一、概念

1.1 Request和Response对比

比较项 请求转发 重定向
发生位置 服务器 浏览器
发送请求次数 1 2
地址是否发生改变
多个Servlet之间是否共享数据
能否访问WEB-INF下的资源
能否访问服务器外部资源

1.2 Servlet 三大作用域

作用域 类型 作用范围
请求域 HttpServletRequest 同一个请求之间能共享数据(地址不变)
会话域 HttpSession 浏览器开启到关闭
上下文域 ServletContext 服务器的开启到关闭

二、请求转发

2.1 原理

交互行为发生在服务器端

2.2 特点

① 请求地址不发生改变
② 多个业务之间能够数据共享
③ 能够访问WEB-INF下的资源
④ 无法访问服务器外部资源

2.3 代码实现验证请求转发特点

首先创建一个简单的登录jsp页面,用于提供数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="/forward/one" method="post">
  用户名:<input type="text" name="username"><br>
  密码:<input type="password" name="password"><br>
  <input type="submit" value="提交">

</form>
</body>
</html>

①+② 请求地址不发生改变,通过jsp页面输入的用户名和密码数据,通过请求转发从第一个页面到第二个页面,访问地址未发生改变,但数据正常获取到了,如下图运行截图
在这里插入图片描述
代码实现:
发送端:

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("/forward/one")
public class OneForward extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置请求和响应的字符集
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //获取输入的用户信息,以验证是否可以进行数据共享
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //在控制台输出 确保获取到了jsp中提交的数据
        System.out.println("one username = " + username);
        System.out.println("one password = " + password);

        //请求转发
        req.getRequestDispatcher("/forward/two").forward(req,resp);
    }
}

获取端:

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("/forward/two")
public class TwoForward extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取输入的用户信息,以验证是否可以进行数据共享
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //在控制台输出 确保获取到了jsp中提交的数据
        System.out.println("two username = " + username);
        System.out.println("two password = " + password);
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("<h1>请求转发页面</h1>");
    }
}

三、重定向

3.1 原理

发生在浏览器端

3.2 特点

① 请求地址发生改变
② 多个Servlet之间不能进行数据共享
③ 不能访问WEB-INF下的数据资源
④ 能够访问服务器外部资源

3.3 代码实现演示重定向特点

①+② 重定向的请求地址发生改变,并且不能接收到其他servlet的数据进行共享
在这里插入图片描述
代码实现
在这里插入图片描述

③ 不能访问WEB-INF下的文件资源,如图所示,添加了test.jsp,重定向后并不能访问到,显示404
在这里插入图片描述
④可以访问外部资源,将重定向路径的位置改成外部地址,比如csdn,显示可以跳转

更多推荐