• Servlet(10)—请求转发和请求重定向


    1. 请求转发与请求重定向
      ①区别:

      • 本质区别:请求转发只发出一次请求,请求重定向则发出两次请求。
      • 请求转发:地址栏是初次发出请求的地址在最终的Servlet中,request对象和中转的那个request是同一个对象
        只能转发给当前web应用的资源
        /表示当前web应用的根目录
      • 请求重定向:地址栏不再是初次发出的请求地址,地址栏为最后响应的那个地址在最终的Servlet中,request对象和中转的那个request不是同一个对象可以重定向到任何资源
        /表示当前web站点的根目录

      ②源代码

      • 请求的转发:
    public class ForWardServlet extends HttpServlet {
    
    private static final long serialVersionUID = 1l;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {                
    
        System.out.println("ForWordServvlet's doGet");
    
        req.setAttribute("name", "abcd");
    
        System.out.println("ForWordServlet:" + req.getAttribute("name"));
    //请求的转发
    //调用HttpServletRequest的getRequestDispatcher(path)方法获取RequestDispatcher对象,
    //调用getRequestDispatcher(path)需要填入转发的地址
        String path = "TestServlet";
        RequestDispatcher requestDispatcher = req.getRequestDispatcher(path);           
    //2.调用HttpSerlvetReuqest的forward(request, response)进行请求转发
        requestDispatcher.forward(req, resp);               
        }
    }
    • 请求的重定向
    public class RedirectServlet extends HttpServlet {
                    private static final long serialVersionUID = 1l;
    
                    @Override
                    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                            throws ServletException, IOException {
                        System.out.println("RedirectServlet's doGet");
                        req.setAttribute("name", "efgh");
                        System.out.println("RedirectSerlvet's name:" + req.getAttribute("name"));
    
                        //请求执行重定向,直接调用response的sendRedirect(path)方法,其中path为重定向的地址
                        String path = "testServlet";
                        resp.sendRedirect(path);
                    }
    
                }
    

    2 . 请求转发与重定向和对象、属性一块使用(实例)

    a.jsp

    <body>
        <h1>A page</h1>
    
    
        <!-- 方式一:include指令 -->
        <%@ include file="b_1.jsp" %>
    
        <!-- 方式二:jsp标签 -->
        <jsp:include page="b_2.jsp">
            <jsp:param value="1234" name="username"/>
        </jsp:include>
    
    
        <!-- 其作用与请求转发一致 -->
        <%-- <jsp:forward page="b_3.jsp">
            <jsp:param value="123" name="username"/>
        </jsp:forward> --%>
    
        <!-- 乱码问题 -->
        <form action="Attr_1.jsp" method="get">
            <input type="text" name="username" value="中文">
            <input type="submit" value="Submit">
        </form>
    
        <%
        //设置属性
        pageContext.setAttribute("pageContextAttr", "pageContextValue"); 
        request.setAttribute("requestAttr", "requestValue"); 
        session.setAttribute("sessionAttr", "sessionValue"); 
        application.setAttribute("applicationAttr", "applicationValue"); 
        %>
    
    </body>

    ①Attr_1.jsp:

    <h1>Attr_1 page</h1>
    
    
                <!-- 获取属性 -->
                pageContextAttr:<%= pageContext.getAttribute("pageContextAttr") %>
                <br><br>
                requestAttr:<%= request.getAttribute("requestAttr") %>
                <br><br>
                session:<%= session.getAttribute("sessionAttr") %>
                <br><br>
                application:<%= application.getAttribute("applicationAttr") %>
    
                <br><br>
                <a href="Attr_2_1.jsp">To Attr_2_1 Page</a>:请求转发到Attr_3.jsp
                <br><br>
                <a href="Attr_2_2.jsp">To Attr_2_2 Page</a>:请求重定向到Attr_3.jsp
                <br><br>
                <a href="Attr_2_3.jsp">To Attr_2_3 Page</a>:请求转发向到Attr_3.jsp,以获取request对象的属性值
        <br><br><br><br>
        <!-- 处理post请求的处理方式 -->
        <% 
            request.setCharacterEncoding("UTF-8");
        %>
            username(处理post):<%= request.getParameter("username") %>
    
    
        <br><br><br>
        <!-- 乱码问题 -->
        <!-- 处理get请求处理方式 -->
        <%
            String val = request.getParameter("username");  
            String username = new String(val.getBytes("UTF-8"), "UTF-8");
            out.println("username(处理get方法一):" + username);
        %>
    
        <!-- 这样处理get请求非常麻烦,可以在apache中server.xml中和eclipse中Servlet项目中的servlet.xml文件相同的位置
        设置usebodyEncoding的值 -->
    
        <br><br><br>
        username(处理get方法二):<%= request.getParameter("username") %>
    
            ②Attr_2_1.jsp:
                <h1>Attr_2_1 page</h1>
                <%
                    //请求转发
                    request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
                %>
    
            ③Attr_2_2.jsp:
                <h1>Attr_2_2 page</h1>
                <%
                    //请求重定向
                    response.sendRedirect("Attr_3.jsp");
                %>
            ④Attr_2_3.jsp:
                <h1>Attr_2_3 page</h1>
                <%
                //设置属性
                pageContext.setAttribute("pageContextAttr", "pageContextValue"); 
                request.setAttribute("requestAttr", "requestValue"); 
                session.setAttribute("sessionAttr", "sessionValue"); 
                application.setAttribute("applicationAttr", "applicationValue"); 
                %>
                <%
                    //请求转发
                    request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
                %>
                <br>
    
            ⑤Attr_3.jsp:
                <h1>Attr_3 page</h1>
                <!-- 获取属性 -->
                pageContextAttr:<%= pageContext.getAttribute("pageContextAttr") %>
                <br><br>
                requestAttr:<%= request.getAttribute("requestAttr") %>
                <br><br>
                session:<%= session.getAttribute("sessionAttr") %>
                <br><br>
                application:<%= application.getAttribute("applicationAttr") %>
    
    
            ⑥页面访问:
                                请求的页面                   到达的页面
                       ——>  Attr2_1.jsp ——>请求转发,    ——> Attr_3.jsp  转发到Attr_3.jsp之后的地址http://localhost:8080/Demo5/Attr_2_1.jsp
            Attr_1.jsp ——>  Attr2_2.jsp ——>请求重定向,   ——> Attr_3.jsp  到Attr_3.jsp之后的地址http://localhost:8080/Demo5/Attr_3.jsp
                       ——>  Attr2_3.jsp ——>请求转发 ——> Attr_3.jsp  (request对象获取requestAttr属性值,以证实request的属性范围),转发后的
                                                    地址http://localhost:8080/Demo5/Attr_2_3.jsp

    ③Attr_2_1.jsp

    <body>
    
        <h1>Attr_2_1 page</h1>
        <%
            //请求转发
            request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
        %>
    </body>

    ④Attr_2_2.jsp

    <body>
    
        <h1>Attr_2_2 page</h1>
    
        <%
            //请求重定向
            response.sendRedirect("Attr_3.jsp");
        %>
    </body>

    ⑤Attr_2_3.jsp

    <body>
    
        <h1>Attr_2_3 page</h1>
    
        <%
        //设置属性
        pageContext.setAttribute("pageContextAttr", "pageContextValue"); 
        request.setAttribute("requestAttr", "requestValue"); 
        session.setAttribute("sessionAttr", "sessionValue"); 
        application.setAttribute("applicationAttr", "applicationValue"); 
        %>
        <%
            //请求转发
            request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
        %>
        <br>
    </body>

    ⑥Attr_3.jsp

    <body>
    
        <h1>Attr_3 page</h1>
        <!-- 获取属性 -->
        pageContextAttr:<%= pageContext.getAttribute("pageContextAttr") %>
        <br><br>
        requestAttr:<%= request.getAttribute("requestAttr") %>
        <br><br>
        session:<%= session.getAttribute("sessionAttr") %>
        <br><br>
        application:<%= application.getAttribute("applicationAttr") %>
    </body>

    结果:
    Attr_1.jsp中三个超链接的结果是

    这里写图片描述

    超链接1:

    这里写图片描述

    超链接2:
    这里写图片描述

    超链接3:
    这里写图片描述

  • 相关阅读:
    超微主板不识别M2-解决方案
    Centos7安装zookpeer
    PowerBI主题制作
    [python错误]UnicodeDecodeError: 'gbk' codec can't decode byte...
    使用Python批量合并PDF文件(带书签功能)
    Oracle使用超大SQL脚本文件恢复数据问题记录
    Linux Mint 18.2安装后需要进行的设置
    Excel使用SUMIF函数注意事项
    CSV文件分割与列异常处理的python脚本
    小程序例子
  • 原文地址:https://www.cnblogs.com/tengpengfei/p/10453985.html
Copyright © 2020-2023  润新知