• JSP中的请求转发与重定向


    在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request

         response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建Cookies等实现;

           重定向:response.sendRedirect(url) (把响应发送到另一个指定的页面进行处理)。

         request:可以对在客户请求中给出的信息进行访问,包含了所有有关当前浏览器的请求信息。

           请求转发:request.getRequestDispatcher(url).forward(request,response)。

    差异:

          1. 请求的次数:

                重定向比请求转发多请求一次,下面以例子说明。

                如果现在有一个需求:A首先向B发出请求,然后B再向C发出请求。

                先看重定向方式(B->C):首先A向B发出请求(第一次),然后B通过重定向的方式跳转到C,但不会直接向C发出请求,而是先返回到A,通过A向C发出请求(第二次),具体看下面这张图。

                然后看请求转发方式(B->C):首先A向B发出请求(第一次),然后B通过请求转发的方式跳转到C,这就不会通过A来跳转,而是B自己直接向C发出请求,具体看下面这张图。

          2.地址栏是否改变:(还是以上面的A.jsp,B.jsp,C.jsp为例)

                         如果现在A要请求B,然后B要请求C。

                        先看重定向方式:首先在浏览器地址栏输入http://localhost:8080/test/A.jsp  (8080是我自己的端口号,test是工程名)

                                                    然后A会跳转到B,此时的地址就是http://localhost:8080/test/B.jsp

                  最后由B跳转到C,地址为http://localhost:8080/test/C.jsp  (第二次请求,A跳转到C,所以地址会发生改变)

                        再看请求转发方式:首先在浏览器地址栏输入http://localhost:8080/test/A.jsp

                                                      然后A会跳转到B,此时的地址就是http://localhost:8080/test/B.jsp

                   最后由B跳转到C,地址为http://localhost:8080/test/B.jsp (仅仅是服务器的内部跳转,所以地址会不会改变)

          

      3.是否保留第一次请求时的数据:

                     再说保留数据之前,先复习一下4种范围对象:pageContext,request,session,application(范围越来越大,造成的性能损耗也越大,所以尽量使用最小的)

                         这四种范围对象有几个很重要的共同的方法:(无论是重定向还是请求转发都要使用到 setAttribute来赋值 和 getAttribute来取值,只不过前者是session调用并且用session来取得数据,后者是request调用并且用request取得数据)

    •              Object getAttribute(String name);//根据属性名返回属性值,注意返回类型
    •         void setAttribute(String name,Object obj);//根据属性名设置属性值,如果没有改属性,则新建一个属性,然后赋值
    •              void removeAttribute(string name);//根据属性名删除属性值
    1.          pageContext:仅仅是当前页面有效(只要跳转了,就失效,null),下方的代码就会输出world
       1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
       2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       3 <html>
       4   <head>
       5     <title>test</title>
       6   </head>
       7   <body>
       8     <%
       9          pageContext.setAttribute("hello", "world");
      10     %>
      11     
      12     <%=pageContext.getAttribute("hello")%>
      13   </body>
      14 </html>
    2.            request:同一次请求有效(比如请求转发,就是同一次请求,而重定向属于两次请求),下方的代码就是通过请求转发的方式传送数据,也就是说请求转发会保存数据(即使B.jsp再次跳转到其他页面,通过request还是可以取到数据)
       1 <!-- A.jsp -->
       2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
       3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       4 <html>
       5   <head>
       6     <title>test</title>
       7   </head>
       8   
       9   <body>
      10     <%
      11          request.setAttribute("hello", "world");
      12          request.getRequestDispatcher("B.jsp").forward(request,response);
      13     %>
      14     
      15   </body>
      16 </html>
       1 <!-- B.jsp -->
       2 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
       3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       4 <html>
       5   <head>
       6   </head>
       7   
       8   <body>
       9     <%=request.getAttribute("hello")%>
      10   </body>
      11 </html>

      但如果利用重定向的方式跳转到B.jsp,将不会把数据传过去,但如果还是想用重定向,可以利用下面这个内置对象session

    3.           session:同一次会话有效(只要浏览器不关,都属于同一次会话,无论是重定向还是请求转发,都有效;关闭或切换浏览器后无效;),session是存在于服务器端的,所以如果使用重定向的方式跳转,可以利用session来获取数据(并不是重定向传了数据,而是获取了服务器端的数据)
       1 <!--A.jsp  -->
       2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
       3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       4 <html>
       5   <head>
       6     <title>test</title>
       7   </head>
       8   
       9   <body>
      10     <%
      11          session.setAttribute("hello", "world");
      12          response.sendRedirect("B.jsp");
      13     %>
      14   </body>
      15 </html>
       1 <!-- B.jsp -->
       2 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
       3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       4 <html>
       5   <head>
       6   </head>
       7   <body>
       8     <%=session.getAttribute("hello")%>
       9   </body>
      10 </html>
    4.        application:全局变量,整个项目运行期间都有效(浏览器切换仍然有效,但关闭浏览器后在启动浏览器是无效的),但只对当前项目有效(其他项目是无法访问的)此处不贴代码。

          该笔记如有错误,还请斧正。

  • 相关阅读:
    Activiti流程实例
    Activiti使用步骤 (IDEA)
    工作流简介
    并发编程常见面试题
    navicat自动备份数据,可实现每天定时备份
    MySQL, SQLite 和 PostgreSQL 关于information_schema 的一些查询(表结构,表信息,库信息....)
    GIS相关网站下载全国的GeoJSON格式数据可以到区县级数据
    GIS当中使用uDig打开shp图层,并查看数据结果
    解决Failed to execute goal org.apache.maven.plugins 错误,JDK版本不一致
    Maven插件maven-assembly-plugin进行打包部署
  • 原文地址:https://www.cnblogs.com/baikaizhuliangshui/p/11496377.html
Copyright © 2020-2023  润新知