重定向和转发
1.1 重定向
1.1.1重定向的概念
- 首先客户浏览器发送http请求,当web服务器接受后发送302状态码响应及对应新的location给客户浏览器。
- 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。
1.1.2 重定向的实现
- 实现重定向需要借助javax.servlet.http.HttpServletResponse接口中的以下方法:
方法声明 | 作用 |
---|---|
void sendRedirect(String location) | 使用指定的重定向位置URL向客户端发送临时重定向响应 |
1.1.3 重定向的原理
1.1.4 重定向的特点
- 重定向之后,浏览器地址栏的URL会发生改变。
- 重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象。
- 重定向的URL可以是其它项目工程。
1.1.5 代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>重定向跳转</title>
</head>
<body>
<form action="redirectServlet" method="post">
<input type="submit" value="重定向">
</form>
</body>
</html>
服务端
package cn.guardwhy.demo01;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收到了浏览器的请求");
// 1.重定向,给浏览器发送一个新的位置
response.sendRedirect(request.getContextPath() + "/test01.html");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
页面端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>重定向后的页面</title>
</head>
<body>
<h3>服务器重新指定位置后的页面</h3>
</body>
</html>
执行结果
1.2 转发
1.2.1 转发的概念
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,转发
的各个组件会共享Request和Response对象。
1.2.2 转发的实现
- 绑定数据到Request对象
方法声明 | 作用 |
---|---|
Object getAttribute(String name) | 将指定属性值作为对象返回,若给定名称属性不存在,则返回空值。 |
void setAttribute(String name,Object o) | 在此请求中存储属性值。 |
- 获取转发器对象
方法声明 | 作用 |
---|---|
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象充当位于给定路径上的资源的包装器 |
- 转发操作
方法声明 | 作用 |
---|---|
void forward(ServletRequest request, ServletResponse response) | 将请求从一个servlet转发到服务器上的另一个资源(Servlet、JSP文件或HTML文件) |
1.2.3 转发的特点
- 转发之后浏览器地址栏的URL不会发生改变。
- 转发过程中共享Request对象。
- 转发的URL不可以是其它项目工程。
1.2.4 转发的原理
1.2.5 代码示例
前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>转发跳转</title>
</head>
<body>
<form action="forwardServlet01" method="post">
<input type="submit" value="转发">
</form>
</body>
</html>
服务端
package cn.guardwhy.demo02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/forwardServlet01")
public class ForwardServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收到了浏览器的请求");
// 1.向请求域中添加键值对
request.setAttribute("username", "kobe");
// 2.转发,也就是让Web组件将任务转交给另外一个Web组件
request.getRequestDispatcher("/forwardServlet02").forward(request, response);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
package cn.guardwhy.demo02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/forwardServlet02")
public class ForwardServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("数据转发过来了");
// 1.从请求域中取出用户名
String username = (String) request.getAttribute("username");
System.out.println("获取的用户名:" + username);
// 2.设置编码
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("从请求域中取出用户:" + username);
out.write("<h3>转发成功...</h3>");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
执行结果
1.2.6 重定向和转发的区别
区别 | 转发forward() | 重定向sendRedirect() |
---|---|---|
地址栏 | 不会变化 | 会显示新的地址 |
哪里跳转 | 服务器端 | 浏览器端 |
请求域中数据 | 不会丢失 | 会丢失 |
根目录 | http://localhost:8080/项目名 | http://localhost:8080 |