请求转发
什么是请求转发?
-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"); |
| |
| User user = new User(); |
| user.setHost("http://fl"); |
| user.setId(1); |
| user.setName("fl"); |
| |
| req.setAttribute("user",user); |
| |
| |
| |
| |
| |
| |
| resp.sendRedirect("/index.jsp"); |
| |
| |
| } |
| } |
| 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; |
| } |
| } |
| <%@ 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> |
- 请求转发测试

- 重定向测试
