解析:重定向和恳求转发

    添加时间:2013-6-16 点击量:

     


    解析:重定向和恳求转发



    重定向


      HttpServletResponse对象的sendRedirect(java.lang.String location)办法称作重定向


      若是location地址前面加上“/”,则默示相对于Servlet容器的根来恳求,比如http://localhost:8080;若是location地址前面没有加上“/”,则默示相对于当前恳求的URI来寻找地址。



    恳求转发


      RequestDispatcher的:forward(ServletRequest request, ServletResponse response)办法叫做恳求转发。


      



    实验例子1:重定向和恳求转发似乎都是造成页面跳转


      第一个页面first.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>My JSP first.jsp starting page</title>

    <meta http-equiv=pragma content=no-cache>
    <meta http-equiv=cache-control content=no-cache>
    <meta http-equiv=expires content=0>
    <meta http-equiv=keywords content=keyword1,keyword2,keyword3>
    <meta http-equiv=description content=This is my page>
    <!--
    <link rel=stylesheet type=text/css href=styles.css>
    -->

    </head>

    <body>
    <form action=Second>
    <input type=text name=username>
    <input type=submit value=submit>
    </form>
    </body>
    </html>


    first.jsp


      第二个页面是Servlet:


      用恳求转发:




    package com.shengqishiwind.servlet;
    

    import java.io.IOException;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class Second extends HttpServlet
    {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    process(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    process(request, response);

    }

    private void process(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException
    {
    // 恳求转发
    RequestDispatcher rd = request.getRequestDispatcher(third.jsp);
    rd.forward(request, response);
    }

    }



      用重定向,则把处理惩罚办法改为:



        private void process(HttpServletRequest request,
    
    HttpServletResponse response)
    throws ServletException, IOException
    {
    // 重定向
    response.sendRedirect(third.jsp);

    }



      第三个页面是third.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>My JSP third.jsp starting page</title>

    <meta http-equiv=pragma content=no-cache>
    <meta http-equiv=cache-control content=no-cache>
    <meta http-equiv=expires content=0>
    <meta http-equiv=keywords content=keyword1,keyword2,keyword3>
    <meta http-equiv=description content=This is my page>
    <!--
    <link rel=stylesheet type=text/css href=styles.css>
    -->

    </head>

    <body>
    This is my Third page.
    <br>
    </body>
    </html>



      不管用恳求转发还是重定向的办法,第一个页面点击提交后,都能顺利转到第三个页面:



      然则其实实际进行的操纵还是很不合的,看下面的例子。




    实验例子2:若是要在第三个页面中取得第一个页面输入的用户名


      恳求转发的实现斗劲简单,第二个页面的Servlet代码不消添加任何器材,可以直接从第三个页面getParameter,即把third.jsp中的body改为:




      <body>
    
    This is my Third page.
    <br>
    用户名:
    <%=request.getParameter(username%>
    </body>


      则在第一个页面输入shengqishiwind,提交后,第三个页面显示:



      重定向应当怎么实现获取第一个页面提交的用户名呢?


      第三个页面采取如上的代码(经由过程getParameter获取参数),把第二个页面中改为重定向的跳转体式格式,从头来一次,可以看到显示:



      再测验测验第二个页面如许(经由过程setAttribute存储值):



        private void process(HttpServletRequest request,
    
    HttpServletResponse response)
    throws ServletException, IOException
    {
    String username
    = request.getParameter(username);
    // 重定向
    request.setAttribute(username, username);
    response.sendRedirect(
    third.jsp);

    }


      然后第三个页面如许获取:



         用户名:<%=request.getAttribute(username%>    


      仍然是不可,获得的仍然是null值。




    重定向和恳求转发的差别


    恳求转发:


      RequestDispatcher是经由过程调用HttpServletRequest对象的getRequestDispatcher()办法获得的,是属于恳求对象的办法。


      恳求转发,全部过程处于同一个恳求傍边。 


      不管经验了几许组件,都可以从request中直接取得想要的值。


      应用恳求转发时,到成果页面的网址是:http://localhost:8080/HelloWeb/Second?username=wind



    重定向: 


      sendRedirect()HttpServletResponse对象的办法,即响应对象的办法。


      既然调用了响应对象的办法,那就注解全部恳求过程已经停止了,办事器开端向客户端返回履行的成果。


      sendRedirect调用后会向客户端返回一个响应,这个响应告诉客户端要转向的页面,紧接着客户端又会发送一个新的恳求,转向这个目标页面


      也便是说,重定向的过程中实际上客户端会向办事器发送两个恳求。



      应用重定向时,成果页面的网址是:http://localhost:8080/HelloWeb/third.jsp


      申明客户端已经知道了成果页面的地址,是从头发送的全新的恳求。


      重定向体式格式在Firebug中的图:





      总结记忆恳求转发只有一个恳求,所以一往无前,调用的办法叫forward;而重定向须要客户端从头发送恳求,调用的是sendRedirect,名字里有个Re,默示反复。



    参考材料:


      圣思园张龙教员视频教程。


      Java Document API with examples:


      http://www.javadocexamples.com/


     

    分享到: