重定向与转发

一、重定向

1、引入

客户端请求服务器时,服务器将响应的状态码设置为302,并添加location的响应头,告知客户端将location的值作为新的URL重新确定请求。客户端收到响应后,根据location的值重新发送请求。

2、示例

方式一:设置状态码和location头

package com.jingxin.servlet;

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

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //设置状态码
        response.setStatus(302);
        //设置location头,建议写绝对路径
        response.setHeader("Location", "http://localhost:8080/demo2/index.html");
    }

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

}

方式二:直接设置重定向

package com.jingxin.servlet;

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

@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("http://localhost:8080/demo2/index.html");
    }

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

    }

}

二、转发

1、引入

当前请求未完成,服务器需要调用自身的其他资源(Servlet、html、jsp)来处理客户端的请求,完成响应。(需要多个资源来合作完成请求的处理)

2、分类

  • forward : 会清除之前资源设置的响应缓冲区内容,只保留最后一个资源设置的内容,会保留所有资源设置的响应头
  • include:合并所有资源设置的响应内容,只保留第一个资源设置的响应头,忽略其他资源设置的响应头

资源:指Web项目中的Servlet、html、jsp

3、示例

forward转发

package com.jingxin.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("CServlet");//最终的响应中会将其擦除
        response.setHeader("CServlet", "CServlet");//最终响应头中存在
        //获取请求调度器
        RequestDispatcher dispatcher = request.getRequestDispatcher("/DServlet");
        //转发请求
        dispatcher.forward(request, response);
    }


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

}
package com.jingxin.servlet;

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

@WebServlet("/DServlet")
public class DServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("DServlet");//最终响应体中存在
        response.setHeader("DServlet", "DServlet");//最终响应头中存在
    }

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

    }

}

执行结果

这里写图片描述

image


include 包含

package com.jingxin.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/EServlet")
public class EServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("EServlet<br/>");//会将响应内容合并
        response.setHeader("EServlet", "EServlet");//保留响应头
        //获取请求调度器
        RequestDispatcher dispatcher = request.getRequestDispatcher("/FServlet");
        //请求包含
        dispatcher.include(request, response);
    }

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

}
package com.jingxin.servlet;

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

@WebServlet("/FServlet")
public class FServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("FServlet");//会合并响应内容
        response.setHeader("FServlet", "FServlet");//会被忽略
    }

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

}

执行结果

这里写图片描述

这里写图片描述

三、重定向与转发的区别

  • 重定向是两次请求,转发是一次请求
  • 重定向是浏览器地址栏会发生变化,转发时浏览器地址栏不变
  • 重定向可以指定当前Web项目的资源也可以指定其他Web项目的资源,转发只能指定当前Web项目的资源
  • 重定向第一次请求设置的值重定向后不能获取,转发时设置的值可以在转发的资源中获取
  • 完成页面跳转功能选择重定向,多个资源中需要传递数据选择转发
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值