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:
这里写图片描述

转载于:https://www.cnblogs.com/tengpengfei/p/10453985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值