JavaWeb 重定向与请求转发的区别和执行流程(图解分析)

JavaWeb 重定向与请求转发的区别和执行流程(图解分析)

本文通过现实生活的例子引出重定向和请求转发,通过图解的方式讲解了整执行流程,希望可以帮助到大家

区别

序号问题重定向请求转发
1第二次请求谁请求的?浏览器服务器
2浏览器发送了几次请求?2次以上1次
3servlet可以共享request吗?不可以可以
4地址栏是否发生改变?不是
5浏览器地址栏显示的哪一次访问地址?最后一次第一次
6可以跳转到什么资源?任意资源项目内部
7第二次的请求路径是?绝对路径内部路径

如果servlet执行流程不清楚可以查看原创博主的另外一篇文章:
https://blog.csdn.net/u010452388/article/details/80395679

现实生活的例子

重定向

这里写图片描述
①:A对B说,帮忙拿下快递
②:B对A说,没有空,你找下C吧
③:A对C说,帮忙拿下快递
④:C然后拿了快递给A

请求转发

这里写图片描述
①:A对B说,帮忙拿下快递
②:第二步,B没有空,直接找让C帮A拿下快递
③:C拿到了快递并返回给A

重定向-流程图、代码、结果

1.流程图

这里写图片描述

2.1代码BoyServlet


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

public class BoyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取请求携带的id
        String id = request.getParameter("id");
        System.out.println("A对B说:帮我拿下快递,id号是:" + id);
        System.out.println("B对A说:我没有空,你找下C");
        System.out.println("----分割线----");
        // 重定向方式1:
        response.setStatus(302);
        response.setHeader("location", "/redirect/girl");
        // 重定向方式2:(正常用此方法)
        // response.sendRedirect("/redirect/girl");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

2.2代码GirlServlet


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GirlServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置浏览器解析的格式,否则浏览器会出现乱码
        response.setContentType("text/html;charset=utf-8");
        //获取请求携带的id
        String id = request.getParameter("id");
        System.out.println("A对C说,帮我拿下快递,id号是:"+id);
        System.out.println("拿到快递了");
        //获取输出流
        PrintWriter writer = response.getWriter();
        //将信息返回给浏览器
        writer.println("拿到快递了");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

2.3web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>redirect</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>BoyServlet</display-name>
    <servlet-name>BoyServlet</servlet-name>
    <servlet-class>com.redirect.BoyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BoyServlet</servlet-name>
    <url-pattern>/boy</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>GirlServlet</display-name>
    <servlet-name>GirlServlet</servlet-name>
    <servlet-class>com.redirect.GirlServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GirlServlet</servlet-name>
    <url-pattern>/girl</url-pattern>
  </servlet-mapping>
</web-app>

3.结果

3.1浏览器输入
这里写图片描述
3.2浏览器返回结果
这里写图片描述
3.3控制台打印结果
这里写图片描述

请求转发-流程图、代码、结果

1.流程图

这里写图片描述

2.1代码BoyServlet


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 BoyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取请求携带的id
        String id = request.getParameter("id");
        System.out.println("A对B说:帮我拿下快递,id号是:" + id);
        System.out.println("B对A说:好的");
        System.out.println("----分割线----");
        //---后面B直接在服务器将请求转发给C---
        //获取转发对象,后面括号指定了转发的路径
        RequestDispatcher dispatcher = request.getRequestDispatcher("/girl");
        //执行转发功能,并将请求和响应一并转发过去
        dispatcher.forward(request, response);

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

2.2代码GirlServlet


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GirlServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置浏览器解析的格式,否则浏览器会出现乱码
        response.setContentType("text/html;charset=utf-8");
        // 获取请求携带的id
        String id = request.getParameter("id");
        System.out.println("B对C说:帮A拿下快递,id号是:" + id);
        System.out.println("拿到快递了");
        // 获取输出流
        PrintWriter writer = response.getWriter();
        // 将信息返回给浏览器
        writer.println("拿到快递了");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

2.3web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>dispatcher</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>BoyServlet</display-name>
    <servlet-name>BoyServlet</servlet-name>
    <servlet-class>com.dispatcher.BoyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BoyServlet</servlet-name>
    <url-pattern>/boy</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>GirlServlet</display-name>
    <servlet-name>GirlServlet</servlet-name>
    <servlet-class>com.dispatcher.GirlServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GirlServlet</servlet-name>
    <url-pattern>/girl</url-pattern>
  </servlet-mapping>
</web-app>

3.结果

3.1浏览器输入
这里写图片描述
3.2浏览器返回结果
这里写图片描述
3.3控制台结果
这里写图片描述

————————————————

版权声明:本文为CSDN博主「阿顾同学」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010452388/article/details/80398929

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值