转发(forward)和重定向(redirect)

转发和重定向

参考: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效率低

 

 

 

转发:

浏览器发送请求——>服务器运行——>进行请求的重新设置——>根据转发时的地址获取该地址的网页——>将请求相应给浏览器

重定向:

浏览器发送请求——>服务器运行——>相应请求,返回给浏览器一个状态码(一个新的地址)——>浏览器根据状态码判定响应为重定向,自动发送一个新的请求给服务器,请求是返回的新的地址——>服务器运行——>将请求相应给浏览器

 

posted @ 2017-08-31 18:08  九零大叔芭蕉  阅读(417)  评论(0编辑  收藏  举报