zoukankan      html  css  js  c++  java
  • 重定向与转发

    重定向与转发是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发出请求,

  • 相关阅读:
    一千行 MySQL 学习笔记
    linux学习(二)
    linux学习(二)
    内联元素
    内联因素1.默认内容撑开盒子大小
    定位absolute使内联支持宽高(块属性变为内联,内容默认撑开)margin auto 失效
    over
    float浮动问题:会造成父级元素高度坍塌;
    float的元素脱离文档流,但不完全脱离,只是提升了半层;
    float了的元素和内联元素不支持margin:auto
  • 原文地址:https://www.cnblogs.com/Serean/p/4483599.html
Copyright © 2011-2022 走看看