请求转发

什么是请求转发?

-request.getRequestDispatcher(URL地址).forward(request,response)

  • 客户端发送请求,Servlet做出业务逻辑处理
  • Servlet调用forward()方法,服务器Servlet把目标资源返回给客户端浏览器
  • ⚠️ 在浏览器地址栏中不会显示出转发后的地址,属于服务器内部转发,整个过程处于同一个请求当中,所以转发中数据的存取可以用request 作用域
    • 存储Java对象到request作用域,转发后一样可以获取到值,具体怎么获取?JSP或者EL表达式
    • request.setAttribute("name","Tom");
    • 示意图
      请求响应示意图

重定向

什么是重定向?

  • 客户端发送请求,Servlet做出业务逻辑处理
  • Servlet调用response.sendRedirect("xxx.jsp")方法,把要访问的目标资源作为response响应信息发送给客户端浏览器
  • 客户端浏览器重新访问服务器资源xx.jsp(或者其他),服务器再次对客户端浏览器做出响应
  • 请求重定向,不能访问WEB- INF下的文件,浏览器上的窗口地址会改版,可以用于跳转第三方地址或者应用里面的其他Servlet、Jsp
  • ⚠️
    • 重定向是取不到request中存储的数据,如果当前Servlet是重定向,浏览器可以看到两个请求
    • 调用sendRedirect()方法,会在响应中设置Location响应报头,这个过程对于用户来说是透明的,浏览器会自动完成新的访问
    • 重定向路径问题:如果没有加http开头,则认为是当前应用里面的Servlet重定向,默认加上应用上下文;如果加上http则会使用配置的全路径进行跳转
    • 如果请求转发可以满足需要时,尽量使用请求转发,而不是重定向,效率会更好
    • 示意图
      请求转发示意图

示?

@WebServlet("/forward")
public class DispatchServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("net.fl.web.DispatchServlet doGet");
//        req.setAttribute("name","fl");
        User user = new User();
        user.setHost("http://fl");
        user.setId(1);
        user.setName("fl");

        req.setAttribute("user",user);
        //请求转发
//        req.getRequestDispatcher("index.jsp").forward(req, resp);
//        req.getRequestDispatcher("request").forward(req, resp);

        //重定向
        //内部跳转
        resp.sendRedirect("/index.jsp");
        //外部站点跳转
//        resp.sendRedirect("https://baidu.com");
    }
}
  • User.java
public class User {
    private int id;

    private String name;

    private String host;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }
}
  • index.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<body>
<h2>Hello World!</h2>
<div>JSP页面</div>
index.jsp
<hr>
name:${user.name}
<hr>
id:$user.id}
<hr>
host:${user.host}
</body>
</html>
  • 请求转发测试
    请求转发
  • 重定向测试
    重定向