Java登陆第二十九天——请求转发和响应重定向
请求转发和响应重定向都是间接访问项目某资源的手段
请求转发
顾名思义,是客户端请求的转发,所以此方法是HttpServletRequest的一个方法
方法 | 描述 |
---|---|
RequestDispatcher getRequestDispatcher(String var1) | 获取请求转发对象,var1是资源地址 |
RequestDispatcher方法 | 描述 |
---|---|
void forward(ServletRequest var1, ServletResponse var2) | 请求转发 |
-
请求转发特性
-
可以访问静态资源(html)和动态资源(servlet)
-
因为请求、响应对象是同一个,所以参数会被保留
-
请求转发是面对服务器的,客户端并不知晓请求被转发了
-
可以访问WEB-INF中的信息
-
不能将请求转发到外部项目(不是本项目的项目)
-
请求转发栗子
TestServlet4
@WebServlet("/Test4")
public class TestServlet4 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问了Test4");
RequestDispatcher rd = req.getRequestDispatcher("Test4B");
//直接把Test4的请求、响应对象传给Test4B
rd.forward(req,resp);
}
TestServlet4B
@WebServlet("/Test4B")
public class TestServlet4B extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问了Test4B");
//不能访问本项目之外的项目。
RequestDispatcher rs = req.getRequestDispatcher("www.baidu.com");
rs.forward(req,resp);
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test4
//控制台输出
访问了Test4
访问了Test4B
然后报错👇(因为不能访问外部项目)
访问WEB-INF下资源
a.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是WEB-INF下a.html
</body>
</html>
TestServlet4
@WebServlet("/Test4")
public class TestServlet4 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问了Test4");
//访问受保护资源
RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/a.html");
rd.forward(req,resp);
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test4
响应重定向
顾名思义,是服务端响应的重新定位,所以此方法是HttpServletResponse的一个方法
方法 | 描述 |
---|---|
void sendRedirect(String var1) | 服务器重定向到新URL |
-
响应重定向特性
-
可以访问静态资源和动态资源
-
请求、响应对象不算同一个,无法保留参数
-
响应重定向是面对客户端的,客户端知晓
-
无法访问WEB-INF中的信息(可以把重定向当作一次新的请求)
-
可以重定向至外部项目(因为是一次新的请求,等于去请求了外部项目而已)
-
响应重定向栗子
TestServlet4
@WebServlet("/Test4")
public class TestServlet4 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问了Test4");
resp.sendRedirect("Test4B");
}
}
TestServlet4B
@WebServlet("/Test4B")
public class TestServlet4B extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问了Test4B");
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test4
//控制台输出
访问了Test4
访问了Test4B