Request请求转发和重定向

Request请求转发和重定向

一,Request请求转发
(一),请求转发:在服务器内部的资源跳转的方式
我们在实际开发中,需要写不同的servlet,每个人servlet完成不同的功能,当我们访问Aservlet的时候, Aservlet实现部分功能后需要跳转到一个新的Bservlet里面,这就是资源跳转的方式,就用到了请求转发。
在这里插入图片描述

(二),写法
1.通过request对象获取请求转发器对象
创建request的getRequsetDispatche对象,参数为转发的访问路径。
⒉.调用dispatcher对象的 forword(),参数为request和response
代码展示:
1,A servlet (关羽)

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;
import java.io.IOException;

@WebServlet("/test02")
public class test02_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我乃关二爷,需要找三弟借纹银五两,全是为了买破鞋的大哥");
        //1,获取request的请求转发器  内部参数为转发的路径
        RequestDispatcher dispatcher = request.getRequestDispatcher("/test03");
        //2,调用转发器对象 传入参数request和response
        dispatcher.forward(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述

2,B servlet (张飞)

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

@WebServlet("/test03")
public class test03_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {           
        System.out.println("我乃燕人张飞,借你五两");
    }

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

运行结果:
在这里插入图片描述

(三)转发特点
1,浏览器地址栏不发生变化
2,只能转发到当前服务器的内部资源,不能转发至服务器外部资源
3,转发只是一次请求,多个资源之间使用同一个请求(可点开浏览器右键检查,查看network all查看请求)
二,数据共享
在这里插入图片描述
以上图为例,当A servlet工作了一部分后,需要转发至B servlet的时候,需要告诉B,A工作到了什么地步,这时就需要进行数据的传输。这即是数据共享。
数据共享,就用到了域对象。所谓域对象,就是一个有作用范围的对象,可以在范围呢共享数据。
1,Request数据的作用域:
一次请求的范围,数据可进行传输的范围,一般用于请求转发的多个资源中共享数据。
2,数据共享的方法:
void setAttribute(String name,Obj obj):存储数据
Obj getAttribute(String name):通过名字获取值
void removeAttribute(String name):通过键名来移除键值对
3,代码展示:
①,A servlet (关羽)

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;
import java.io.IOException;

@WebServlet("/test02")
public class test02_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我乃关二爷,需要找三弟借纹银五两,全是为了买破鞋的大哥");
        //域对象共享数据  request.setAttribute("键","值")
        request.setAttribute("money","5两");

        //1,获取request的请求转发器  内部参数为转发的路径
        RequestDispatcher dispatcher = request.getRequestDispatcher("/test03");
        //2,调用转发器对象 传入参数request和response
        dispatcher.forward(request,response);


    }

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

②,B servlet (张飞)

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

@WebServlet("/test03")
public class test03_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过名字获取值   (通过money获取到五两)
        Object money = request.getAttribute("money");

        System.out.println("Money:"+money);
        System.out.println("我乃燕人张飞,借你五两");
    }

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

运行结果:
在这里插入图片描述
注:数据共享的作用域是一次请求范围,所以A和B必须在同一个请求中。
三,重定向
(一),重定向就是资源跳转的一种方式
在这里插入图片描述
(二),写法
1,方法1:
通过设置状态码,设置请求路径
步骤:
①,新建两个servlet文件
②,设置响应头location 值为servlet2的路径
在这里插入图片描述
2,方法2:
在这里插入图片描述
(三)代码展示:
1, servlet1

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

@WebServlet("/test04")
public class test04_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("test04来了.....");
        //方法一
        response.setStatus(302);          //设置状态码 302
        response.setHeader("location","/test05"); //设置location,值为servlet2路径
        //方法二
//        response.sendRedirect("/test05");     //将状态码自动封装起来
    }

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

2,servlet2

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

@WebServlet("/test05")
public class test05_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("重定向到了servlet05");
    }

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

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(四)重定向特点
通过和转发的特点进行对比
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值