转发:


结论:
- 转发是获取跳转页面的内容,并且渲染在自己的页面上,下文会使用画图进行讲解
- 域名没有跳转到B.jsp下,而是servlet类绑定的域名
- 使用转发会继续执行转发语句后面的代码
- 转发可以获取到前面A.jsp发来的值,也就是网页请求里面的值
- 经过几次的实验,转发的路径加不加"/“都可以,也就是说
req.getRequestDispatcher(”/B.jsp").forward(req,resp);
req.getRequestDispatcher(“B.jsp”).forward(req,resp);
都可以成功获取到B.jsp的内容
而且我将B.jsp放入jsp目录下时也是如此,
req.getRequestDispatcher("/jsp/B.jsp").forward(req,resp);
req.getRequestDispatcher(“jsp/B.jsp”).forward(req,resp);
也都可以成功获取到B.jsp的内容。
在使用绝对路径开始实验,发现404
由此总结,转发的路径必须是相对路径而不能是绝对路径。 - 把转发的路径更改为https://www.baidu.com/,发现不能跳转至百度。由此可见,转发只能选择项目中的路径。
重定向


结论:
- 重定向是跳转到对应页面,下文会使用画图进行讲解
- 域名跳转到B.jsp下
- 使用重定向会继续执行转发语句后面的代码
- 重定向不能获取到网页请求中的值,即上面的用户名和密码都为NULL
- 经过几次的实验,重定向的路径前面不可以加"/",也就是说
resp.sendRedirect("/B.jsp"); 会报404
resp.sendRedirect(“B.jsp”); 可以跳转到B.jsp
而且我将B.jsp放入jsp目录下时也是如此,
resp.sendRedirect("/jsp/B.jsp"); 会报404
resp.sendRedirect(“jsp/B.jsp”); 可以跳转到B.jsp
在使用绝对路径开始实验,发现404
由此总结,重定向的路径必须是相对路径而不能是绝对路径。 - 把转发的路径更改为https://www.baidu.com/,发现可以跳转至百度。由此可见,重定向可以选择项目之外的路径。
画图

转发: A向服务器发起请求,服务器发起转发请求给B,B收到请求后会返回自己的网页给服务器,服务器在把B的网页渲染在A.jsp表单提交的网页上,即地址栏并没有变化。

重定向: A向服务器发起请求,服务器返回目标网页地址,让A自己去找它,A再向B发起请求,B就
响应A的请求,地址栏便跳转到了B,地址栏发生了变化。
总结
- 转发可以获取到服务器中请求域的值,但是重定向不可以。
- 两者的使用路径都不可以使用绝对路径,路径都是相对于webapp目录的;转发相对宽松,路径前面加不加"/"都可以**,而重定向前面不可以加"/"。
- 两者语句后面的代码都能得到执行。
- 转发的地址栏不会发生变化,而重定向的地址栏会跳转到相对应的域名下。
- 转发只能选择项目中的路径,重定向可以选择项目外的路径。
实验代码和目录结构
<!--前端-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- 创建一个有用户名和密码的表单
对他们进行输入来查看转发和重定向的区别-->
<form action="${pageContext.request.contextPath}/test" method="post">
请输入用户名:<input type="text" name="username">
<br>
请输入密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
//servlet类
package com.zovz.test;
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 TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("username");
String password = req.getParameter("password");
req.setAttribute("username",userName);
req.setAttribute("password",password);
//转发
req.getRequestDispatcher("/B.jsp").forward(req,resp);
System.out.println("程序运行完毕");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}