转发和重定向
参考:http://www.2cto.com/kf/201107/97118.html
以前写的一个注册页面:
1 package com.ifly.bbs.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import com.ifly.bbs.pojo.User; 12 import com.ifly.bbs.service.UserService; 13 import com.ifly.bbs.service.impl.UserServiceImpl; 14 15 @WebServlet("/ZhuCe") 16 public class ZhuceController extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 protected void doGet(HttpServletRequest request, 20 HttpServletResponse response) throws ServletException, IOException { 21 22 request.getRequestDispatcher("/WEB-INF/view/ZhuCe.jsp").forward( 23 request, response); 24 } 25 26 protected void doPost(HttpServletRequest request, 27 HttpServletResponse response) throws ServletException, IOException { 28 29 // 设置编码 30 request.setCharacterEncoding("UTF-8"); 31 response.setCharacterEncoding("UTF-8"); 32 response.setContentType("text/html;charset=UTF-8"); 33 34 // 获取参数 35 String email = request.getParameter("email").trim(); 36 String name = request.getParameter("name").trim(); 37 String psw = request.getParameter("psw").trim(); 38 String comfirmPsw = request.getParameter("comfirmPsw").trim(); 39 40 //注册时判断两次输入的密码是否相同 41 if (!psw.equals(comfirmPsw)) { 42 // 注册失败,保存邮箱 43 request.setAttribute("email", email); 44 45 request.setAttribute("error", "两次密码不一致"); 46 request.getRequestDispatcher("/WEB-INF/view/ZhuCe.jsp").forward( 47 request, response); 48 return; 49 } 50 51 // 调用service代码 52 User user = new User(); 53 user.setEmail(email); 54 user.setName(name); 55 user.setPassword(psw); 56 57 UserService us = new UserServiceImpl(); 58 us.add(user); 59 60 // 重定向 61 response.sendRedirect(request.getContextPath() + "/Login"); 62 63 } 64 65 }
转发:
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效率低
转发:
浏览器发送请求——>服务器运行——>进行请求的重新设置——>根据转发时的地址获取该地址的网页——>将请求相应给浏览器
重定向:
浏览器发送请求——>服务器运行——>相应请求,返回给浏览器一个状态码(一个新的地址)——>浏览器根据状态码判定响应为重定向,自动发送一个新的请求给服务器,请求是返回的新的地址——>服务器运行——>将请求相应给浏览器