Servlet中转发和重定向的区别和使用(转载)
转载地址:https://blog.csdn.net/weixin_40001125/article/details/88663468
前言:
学习Servlet的一个比较重要的点:那就是“转发(forward)和重定向(redirect)那么它们的区别是什么?
页面的跳转:转发(forward)
转发的方法:
请求对象中常用的方法:
概念:
由服务端进行的页面跳转
原理图:
案例
需求
实现从OneServlet中转发到TwoServlet
步骤
- OneServlet向请求域中添加了键和值,转发给TwoServlet
- TwoServlet就从请求域中取出键和值,打印到浏览器上。
效果
代码
OneServlet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package cn.mixky.servlet_test; 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; /** * @author zhangzhixi * @version 1.0 * @date 2021-8-17 22:37 */ @WebServlet(name = "OneServlet" , urlPatterns = "/one" ) public class OneServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher( "utf-8" ); response.setContentType( "text/html;charset=utf-8" ); //向请求域中添加键和值 request.setAttribute( "name" , "zhixi" ); request.setAttribute( "age" , 21); //开始转发,参数是:要跳转到的地址 request.getRequestDispatcher( "/two" ).forward(request, response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this .doPost(request, response); } } |
TwoServlet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package cn.mixky.servlet_test; 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; /** * @author zhangzhixi * @version 1.0 * @date 2021-8-17 22:48 */ @WebServlet(name = "TwoServlet.java" , urlPatterns = "/two" ) public class TwoServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher( "utf-8" ); response.setContentType( "text/html;charset=utf-8" ); PrintWriter out = response.getWriter(); out .print( "这是Two,从请求域中取出one中的值<br>name:" + request.getAttribute( "name" ) + "<br>" ); out .print( "age:" + request.getAttribute( "age" ) + "<br>" ); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this .doPost(request, response); } } |
转发的特点
- 地址栏不发生变化,显示的是上一个页面的地址
- 请求次数:只有1次请求
- 根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
- 请求域中数据不会丢失
- 转发使用哪个方法?
request.getRequestDispatcher("/地址").forward(request, response);
页面的跳转:重定向(redirect)
概念:
由浏览器端进行的页面跳转
原理图:
重定向案例
需求
从OneServlet重定向到TwoServlet
步骤
-
在OneServlet中向请求域中添加键和值
-
使用重定向到TwoServlet,在TwoServlet中看能否取出请求域的值
效果
代码:
需要注意的是,转发是从/当前
重定向的特点
地址栏:显示新的地址
请求次数:2次
根目录:http://localhost:8080/ 没有项目的名字
请求域中的数据会丢失,因为是2次请求
转发跟重定向的使用场景:
问:什么时候使用转发,什么时候使用重定向?
答:如果要保留请求域中的数据,使用转发,否则使用重定向。
以后访问数据库,增删改使用重定向,查询使用转发。
问:转发或重定向后续的代码是否还会运行?
答:重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话