1、跳转的方式

  • 转发:foward
  • 重定向:redirect

2、案例

  • 定义一个register.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>测试转发和重定向</title>
    6. </head>
    7. <body>
    8. <a href="/prj-servlet-02/a">AServlet</a>
    9. </body>
    10. </html>
  • 定义一个AServlet,一个BServlet ```java package com.glutnn.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 AServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //向request范围中存数据 request.setAttribute(“username”,”zhangsan”);

  1. //请求转发forward():一次请求
  2. //request.getRequestDispatcher("/b").forward(request,response);
  3. //重定向redirect:两次请求
  4. //执行到此处,会将/prj-servlet-02/b路径响应给浏览器,浏览器又向web服务器发送一次全新的请求
  5. //response.sendRedirect("/prj-servlet-02/b");//也可以像下面那样写
  6. //此时浏览器地址变化,并且输出null,因为是两次不同的请求
  7. response.sendRedirect(request.getContextPath()+"/b");
  8. }

}

```java
package com.glutnn.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 BServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //取得数据
        Object username = request.getAttribute("username");
        System.out.println(username);
    }
}
  • 配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
           version="4.0">
      <welcome-file-list>
          <welcome-file>register.html</welcome-file>
      </welcome-file-list>
    
      <servlet>
          <servlet-name>AServlet</servlet-name>
          <servlet-class>com.glutnn.servlet.AServlet</servlet-class>
      </servlet>
      <servlet>
          <servlet-name>BServlet</servlet-name>
          <servlet-class>com.glutnn.servlet.BServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>AServlet</servlet-name>
          <url-pattern>/a</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>BServlet</servlet-name>
          <url-pattern>/b</url-pattern>
      </servlet-mapping>
    </web-app>
    

    70.jpg

3、转发和重定向的差异

  • 相同点:都可以完成资源跳转
  • 不同点:

    1. 转发request对象触发的,重定向response对象触发的
    2. 转发是一次请求,浏览器地址栏上地址不会发生变化;重定向是两次请求,浏览器地址栏上的地址会发生变化
    3. 重定向的路径需要加上web项目的根路径
    4. 转发是在本项目内部完成资源跳转
    5. 重定向可以跨app(web项目)跳转资源

      4、跳转的下一个资源可以是什么?

  • 跳转的下一个资源可以是web服务器中任何一种资源:可以是Servlet,也可以是HTML,也可以是JSP……

    5、何时用转发,何时用重定向

  • 若想完成跨app跳转,必须使用重定向

  • 若在上一个资源中向request范围中存储了数据,希望在下一个资源中从request范围中将数据取出,必须使用转发
  • 重定向可以解决浏览器的刷新问题

    6、重定向的原理是什么?

  • response.sendRedirect(“/jd/login”);

  • 程序执行到以上代码,将请求路径/jd/login反馈给浏览器
  • 浏览器自动又向web服务器发送了一次全新的请求:/jd/login
  • 浏览器地址栏上最终显示的地址是:/jd/login

    7、重定向解决刷新问题

  • 重定向,浏览器刷新的是最后一次请求的页面