1、跳转的方式
- 转发:foward
- 重定向:redirect
2、案例
定义一个register.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>测试转发和重定向</title></head><body><a href="/prj-servlet-02/a">AServlet</a></body></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”);
//请求转发forward():一次请求//request.getRequestDispatcher("/b").forward(request,response);//重定向redirect:两次请求//执行到此处,会将/prj-servlet-02/b路径响应给浏览器,浏览器又向web服务器发送一次全新的请求//response.sendRedirect("/prj-servlet-02/b");//也可以像下面那样写//此时浏览器地址变化,并且输出null,因为是两次不同的请求response.sendRedirect(request.getContextPath()+"/b");}
}
```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>
3、转发和重定向的差异
- 相同点:都可以完成资源跳转
不同点:
跳转的下一个资源可以是web服务器中任何一种资源:可以是Servlet,也可以是HTML,也可以是JSP……
5、何时用转发,何时用重定向
若想完成跨app跳转,必须使用重定向
- 若在上一个资源中向request范围中存储了数据,希望在下一个资源中从request范围中将数据取出,必须使用转发
-
6、重定向的原理是什么?
response.sendRedirect(“/jd/login”);
- 程序执行到以上代码,将请求路径/jd/login反馈给浏览器
- 浏览器自动又向web服务器发送了一次全新的请求:/jd/login
-
7、重定向解决刷新问题
重定向,浏览器刷新的是最后一次请求的页面
