重定向与转发

重定向与转发是JSP的一稍难不分.

首先要清楚重定向和转发的意义.

重定向:首先,重定向是一种行为.已下方JSP页面为例,使用response对象的sendRedirect()方法,其执行结果是客户端重新向服务器请求一个新的地址链接;而在之前的提交表单请求中的数据将会随之丢失,这种行为             称为重定向.(请求:是指从客户端服务器端的请求消息)

          (过程:web服务器向浏览器返回一个响应,浏览器接受此响应后再发送一个新的http请求到服务器,这属于两次不同的请求,则上一次请求的request信息将丢失)

          (重定向是在客户端发挥作用,通过请求新的地址实现页面转向.其通过浏览器重新请求,在地址栏中可以显示转向后的地址)

转发:从程序运行角度理解,即当客户端发送一个请求到服务器后,web服务器调用内部方法在容器内部完成请求处理,然后将目标资源发送给浏览器,整个过程都是在一个web容器内完成的,而对应到客户端,无论服务器          内部如何处理,作为浏览器都只是提交了一个请求,因而客户端的URL地址不会改变.

          (过程:web服务器内部将一个request请求的处理权交给另外一个资源,属于同一个访问请求和响应过程,所以request对象的信息不会丢失)

          (转发是在服务器端发挥作用,通过RequestDispatcher对象的forward()方法将提交信息在多个页面进行传递.在服务器内部控制权的转移,客户端浏览器的地址 不会显示出转向后的地址)

重定向与转发的不同:

     1.当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请           求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了         一个新的请求,所以经过一次重定向后,request内的对象将无法使用。

     2.不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题.

     3.重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

    转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>用户登录</title>   

  </head>
  
  <body>
  我是path:<%=path %>
    <form name="form1" method="post" action="mydemo/control.jsp">
    用户名:<input type="text" name="userName">
    密码:<input type="text" name="userPwd">
    <input type="submit" value="登录">
    </form> 
  </body>
</html>
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>登录处理页面</title>  

  </head>
  
  <body>
    <!-- 获取用户信息 -->
    <%
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("userName");
        String pwd = request.getParameter("userPwd");
        if(name.equals("admin")&&pwd.equals("admin")){
            //在跳转页面(重定向)前给请求头设置属性
            request.setAttribute("username", name);
            //跳转(重定向))到欢迎页面
            response.sendRedirect(path+"/mydemo/welcome.jsp");
            //跳转(转发)到欢迎页面
            //转发不需要项目名称
            //request.getRequestDispatcher("/mydemo/welcome.jsp").forward(request, response);
        }else{
            response.sendRedirect(path+"/mydemo/login.jsp");
        }
     %>
  </body>
</html>
control.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>欢迎页面</title>


  </head>
  
  <body>
  <%=request.getAttribute("username") %>
    欢迎进入本页面!~~~~~~~~
  </body>
</html>
welcome.jsp
下面是我个人对重定向和转发的理解(依旧以此处JSP为例):
login.jsp,control.jsp,welcome.jsp
重定向:login.jsp可看做一个发出请求的人.向control.jsp发出请求control.jsp说他的钱不够让login.jsp向welcome.jsp请求借钱,在此看做向他俩借钱,control.jsp与welcome.jsp两者无关系.
转发:login.jsp向control.jsp借钱,control.jsp钱不能满足login的请求,所以,control又向welcome发出请求,

原文地址:https://www.cnblogs.com/Serean/p/4483599.html