zoukankan      html  css  js  c++  java
  • 转发(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效率低

    转发:

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

    重定向:

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

  • 相关阅读:
    旅行锦囊
    生活智慧
    育儿锦囊
    新婚置办
    软件开发心得
    64位sql server2005安装
    Struts学习心得
    Spring学习心得
    Oracle补习班第十天
    Python----文件操作
  • 原文地址:https://www.cnblogs.com/whx20100101/p/7459794.html
Copyright © 2011-2022 走看看