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);
    }
}

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

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java中的请求转发重定向都是用于在不同的Servlet之间进行页面跳转的方式,但它们的实现方式和效果是不同的。 请求转发是指在当前Servlet中处理完请求后,将请求转发给另一个Servlet进行处理,转发后的请求由另一个Servlet来产生响应。请求转发的代码如下: ```java RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); dispatcher.forward(request, response); ``` 其中,`/b`是要转发到的Servlet的路径,`request`和`response`是当前Servlet的请求和响应对象,转发后的请求和响应对象也是这两个对象。 请求转发的特点是:转发后的请求和响应对象与原始请求和响应对象是同一个,因此它们可以共享请求和响应的信息,比如请求参数、请求属性等。此外,请求转发是在服务器端完成的,客户端并不知道发生了转发,因此地址栏中的URL不会改变。 重定向是指在当前Servlet中处理完请求后,将请求重定向到另一个Servlet进行处理,重定向后的请求由浏览器重新发起,由另一个Servlet来产生响应。重定向的代码如下: ```java response.sendRedirect("/b"); ``` 其中,`/b`是要重定向到的Servlet的路径,`response`是当前Servlet的响应对象。 重定向的特点是:重定向后的请求和响应对象与原始请求和响应对象是不同的,因此它们不能共享请求和响应的信息。此外,重定向是在客户端完成的,因此地址栏中的URL会改变。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值