转发(forward)和重定向(redirect)
转发和重定向
参考:http://www.2cto.com/kf/201107/97118.html
以前写的一个注册页面:
package com.ifly.bbs.controller; import java.io.IOException; 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 com.ifly.bbs.pojo.User;
import com.ifly.bbs.service.UserService;
import com.ifly.bbs.service.impl.UserServiceImpl; @WebServlet("/ZhuCe")
public class ZhuceController extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/view/ZhuCe.jsp").forward(
request, response);
} protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { // 设置编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); // 获取参数
String email = request.getParameter("email").trim();
String name = request.getParameter("name").trim();
String psw = request.getParameter("psw").trim();
String comfirmPsw = request.getParameter("comfirmPsw").trim(); //注册时判断两次输入的密码是否相同
if (!psw.equals(comfirmPsw)) {
// 注册失败,保存邮箱
request.setAttribute("email", email); request.setAttribute("error", "两次密码不一致");
request.getRequestDispatcher("/WEB-INF/view/ZhuCe.jsp").forward(
request, response);
return;
} // 调用service代码
User user = new User();
user.setEmail(email);
user.setName(name);
user.setPassword(psw); UserService us = new UserServiceImpl();
us.add(user); // 重定向
response.sendRedirect(request.getContextPath() + "/Login"); } }
转发:
request.getRequestDispatcher("zhuce.jsp").forward(request,response);//转发到zhuce.jsp

重定向:
response.sendRedirect("login.jsp");//重定向到login.jsp

MVC框架中是这样子的:



简单的说有两个明显的不同点:
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发送给浏览器,浏览器根本不知道服务器发送的内容是从哪来的,所以它的地址栏中还是原来的地址。
redirect是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,可以在浏览器的地址栏中看到跳转后的地址,所以地址栏显示的是新的URL。
1.转发时浏览器上的网址不变
重定向时浏览器上的网址会发生变化
2.转发只有一次请求(request)
重定向时实际上会产生两个请求
3.转发可以共享request里面的数据(以前的request中存放的变量不会失效,就像把两个页面拼到了一起。)
重定向不能共享数据(以前的request中存放的变量全部失效,并进入一个新的request作用域。)
4.forward效率高
redirect效率低
转发:
浏览器发送请求——>服务器运行——>进行请求的重新设置——>根据转发时的地址获取该地址的网页——>将请求相应给浏览器
重定向:
浏览器发送请求——>服务器运行——>相应请求,返回给浏览器一个状态码(一个新的地址)——>浏览器根据状态码判定响应为重定向,自动发送一个新的请求给服务器,请求是返回的新的地址——>服务器运行——>将请求相应给浏览器
转发(forward)和重定向(redirect)的更多相关文章
- 转发(Forward)和重定向(Redirect)的区别
转发是服务器行为,重定向是客户端行为. 转发(Forword) :通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServle ...
- 转发forward和重定向redirect的区别
本质区别:转发只发送一次请求,重定向发送两次请求. 转发: request.getRequestDispatcher("/HiServlet").forward(request,r ...
- 请求转发(forward)和重定向(redirect)的区别
转发不会改变地址栏,重定向会. 转发是请求一次,重定向请求两次. 转发过程中只有一个request对象产生,重定向是两个. 转发不能转发到站外,重定向可以发送到站外. 重定向的第2个请求的请求方式是什 ...
- 请求转发(forward)和请求重定向(redirect)的区别(转)
作者:@haimishasha本文为作者原创,转载请注明出处:https://www.cnblogs.com/haimishasha/p/5952129.html 用户向服务器发送了一次HTTP请求, ...
- 直接请求转发(Forward)和间接请求转发(Redirect)两种区别?
用户向服务器发送了一次HTTP请求,该请求肯能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发 ...
- javaWeb中request请求转发和response重定向
1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的&q ...
- 请求转发 和 URL 重定向
五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 ...
- Servlet(10)—请求转发和请求重定向
请求转发与请求重定向 ①区别: 本质区别:请求转发只发出一次请求,请求重定向则发出两次请求. 请求转发:地址栏是初次发出请求的地址在最终的Servlet中,request对象和中转的那个request ...
- 请求转发(forward)和请求包含(include)的区别?
请求包含的例子 第一个Servlet (DispatcherServlet) @Override protected void doGet(HttpServletRequest req, HttpSe ...
- forward:hello 与 redirect:hello的区别
对于某些Controller的处理方法,当返回值为String类型时,返回的结果中可能含有forward或redirect前缀: 如: @Controller @RequestMapping(&quo ...
随机推荐
- Android开发训练之第五章第七节——Transmitting Network Data Using Volley
Transmitting Network Data Using Volley GET STARTED DEPENDENCIES AND PREREQUISITES Android 1.6 (API L ...
- spring的自生一个bug
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 一块移动硬盘怎样兼容Mac和Windows系统,并且可以在time machine上使用
Mac的内存通常不是很大,加上使用Mac的time machine备份的话,是需要外置U盘或硬盘的.U盘存储空间较小,大家也不会去分区,直接拿来用在Mac上或者Windows上就可以了.所以这里只说硬 ...
- MPD软件工作坊上海站本周末在上海举行
本周末(5月26日至27日)由麦思博(msup)主办的第39届MPD软件工作坊即将在上海虹桥会议中心举行.本届MPD将继续围绕软件研发领域,邀请了21位技术大咖,从产品运营.团队管理.架构技术.自动化 ...
- int main(int argc,char *argv[])与int main(int argc,char **argv)区别?
int main(int argc,char *argv[])与int main(int argc,char **argv)区别? 这两种是一个等价的写法 而int main(int argc,cha ...
- got positional argument after named arguments.原因
- [No0000EB]C# 数组(Array)
数组是一个存储相同类型元素的固定大小的顺序集合.数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合. 声明数组变量并不是声明 number0.number1.....number99 一个 ...
- PHP 正则表达式---匹配模式
1.PHP 正则表达式 正则表达式贪婪匹配,非贪婪匹配. 默认是贪婪匹配, 例如 ①.贪婪匹配, $str = ' 香肠 月饼 '; preg_match('/ (.)</td>/',$s ...
- zabbix zatree centos7安装zabbix-agent
https://github.com/Emersonxuelinux/zatree-3.0-/tree/master/zabbix-3.0.x /bin/sh /config/ds.sh /tmp/z ...
- js实现数字千分位
/** * * @param num * @param precision * @param separator * @returns {*} *=========================== ...