侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

JavaWeb(7)之请求转发与重定向

zze
zze
2017-06-11 / 0 评论 / 0 点赞 / 752 阅读 / 3382 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

请求转发

现有如下两个 Servlet:

// /test1
package com.zze.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 TestServlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet1");
        request.getRequestDispatcher("/test2").forward(request,response);
    }
}
// /test2
package com.zze.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 TestServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet2");
        response.getWriter().write("from TestServlet2");
    }
}

访问 localhost:8080/test1,输出结果:

from TestServlet1
from TestServlet2

image.png

重定向

// /test1
package com.zze.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 TestServlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet1");
        response.sendRedirect("/test2");
        /*
        相当于:
        response.setStatus(302);
        response.setHeader("Location","/test2");
        */
    }
}
// /test2
package com.zze.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 TestServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("from TestServlet2");
        response.getWriter().write("from TestServlet2");
    }
}

访问 localhost:8080/test1,输出结果:

from TestServlet1
from TestServlet2

image.png

总结

  1. 地址栏:重定向显示的是最后显示的资源地址;而请求转发显示的是最初请求的那个地址。
  2. 请求次数:重定向最少有两次请求,服务器在接收到请求后,会通过返回状态码 302 告知浏览器需要重定向,通过响应头中的 Location 告知浏览器重定向位置;而请求转发只有一次,因为服务器内部帮客户端执行了后续的工作。
  3. 跳转路径:重定向可以跳转到任意路径,不是自己的工程路径也可以跳转;请求转发只能在当前项目路径中跳转。
  4. request 对象:因为重定向就是发起一个新的请求,所以 request 就是一个新的 request 对象,无法使用上一次的 request 对象;而请求转发本质上还是同一次请求,所以可以正常使用初始请求对象。
0

评论区