Servlet和Jsp中的Request转发、重定向

我们先来看例子,然后在说原理细节

这个例子就是一个html页面有3个链接,一个转发、一个重定向、一个登录

<a href="loginServlet">loginServlet</a>
<br>
<a href="forwardServlet">forwardServlet</a>
<br>
<a href="redirectServlet">redirectServlet</a>

对应的3个web.xml配置文件信息

  <servlet>
    <servlet-name>forwardServlet</servlet-name>
    <servlet-class>com.safly.forwardServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>forwardServlet</servlet-name>
    <url-pattern>/forwardServlet</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>com.safly.loginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/loginServlet</url-pattern>

  <servlet>
    <servlet-name>redirectServlet</servlet-name>
    <servlet-class>com.safly.redirectServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>redirectServlet</servlet-name>
    <url-pattern>/redirectServlet</url-pattern>
  </servlet-mapping>

我们先来看由forwardServlet转发到loginServlet

forwardServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("forwardServlet doGet...");
        //转发
        request.setAttribute("name", "abcde");
        String path = "loginServlet";
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
        requestDispatcher.forward(request, response);
    }

当点击转发链接,就进入到forwardServlet的doGet方法,在这里进行转发,转发很明显,就是转发的request请求,我们request.setAttribute(“name”, “abcde”);为request设置属性,所以我们先request.getRequestDispatcher(“/”+path);获取一个转发器,然后在进行requestDispatcher.forward(request, response);

我们就结合具体的效果分析下吧:

点击红色的链接,进入到forwardServlet在进行转发:
这里写图片描述
点击后,浏览器url地址如下,在转发到loginServlet中(代码中只有在doGet方法中有一个打印),地址栏url没有发生变化
http://localhost:8080/day01/forwardServlet

以下是控制台输出:
forwardServlet doGet…
loginServlet doGet…
loginServlet name:abcde(request转发携带过来的属性值)

我们看看redirectServlet

redirectServlet.java

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("redirectServlet doGet...");
        request.setAttribute("name", "abcde");
        String path = "loginServlet";
        response.sendRedirect(path);
    }

当点击转发链接,就进入到redirectServlet的doGet方法,在这里进行重定向,我们request.setAttribute(“name”, “abcde”);为request设置属性,将response直接重定向到loginServlet,然后由loginServlet 方法,方法为response.sendRedirect(path);

我们就结合具体的效果分析下吧:
这里写图片描述
点击后,浏览器url地址如下,重定向到loginServlet中(代码中只有在doGet方法中有一个打印),地址栏url没有发生变化
http://localhost:8080/day01/loginServlet

以下是控制台输出:
redirectServlet doGet…
loginServlet doGet…
loginServlet name:null(重定向没有携带redirectServlet 设置的request属性值)

我们来简单了解下Jsp中是如何进行转发的

A.jsp

<body>
<h4>AAA PAGE</h4>
<a href="B.jsp">To B</a>
</body>

B.jsp

<body>
 <h4>BBB PAGE</h4>
    <%
        request.getRequestDispatcher("/C.jsp").forward(request,response);
     %>
</body>

C.jsp

<body>
    <h4>CCC PAGE</h4>
</body>

这里写图片描述

点击楼上截图链接后,地址栏没有发生变化

这里写图片描述

我们来简单了解下Jsp中是如何进行重定向的

A.jsp

<body>
<h4>AAA PAGE</h4>
<a href="B.jsp">To B</a>
</body>

B.jsp

<body>
 <h4>BBB PAGE</h4>
    <%
     response.sendRedirect("C.jsp");
     %>
</body>

C.jsp

<body>
    <h4>CCC PAGE</h4>
</body>

这里写图片描述
点击楼上截图链接后,地址栏发生了变化
这里写图片描述

简单总结下:
转发:
1、是地址栏初次发出请求的地址
2、最终的Servlet中,request对象和中转的那个request为同一个对象
3、只能转发给当前web应用的资源
重定向:
1、地址栏不在是初次发出请求的地址,为最后相应的地址
2、最终的Servlet中,request对象和中转的那个request不是同一个对象
3、可以重定向任何资源

阅读更多
换一批

没有更多推荐了,返回首页