request请求转发、数据共享及response重定向

request请求转发

请求转发:在服务器内部的资源跳转的方式

我们在实际开发中,需要写不同的servlet,每个人servlet完成不同的功能,当我们访问servlet01的时候,servlet01实现部分功能后需要跳转到一个新的Servlet02里面,这就是资源跳转的方式,就用到了请求转发。

示意图如下:
在这里插入图片描述

转发特点:

  • 浏览器地址栏不发生变化(可参考运行结果P1)
  • 只能转发到当前服务器的内部资源,不能转发至服务器外部资源
  • 转发只是一次清求,多个资源之间使用同一个请求,可以使用request共享数据

request数据共享

以刘关张为例,当刘备向关羽借钱后,需要转发至张飞的时候,需要告诉张飞,关羽有多少钱,这时就需要进行数据的传输。这就是数据共享。

数据共享,就用到了域对象。所谓域对象,就是一个有作用范围的对象,可以在范围内共享数据。

Request数据的作用域:一次请求的范围,数据可进行传输的范围,一般用于请求转发的多个资源中共享数据。

数据共享的方法:

  • setAttribute(String name,Obj obj) 存储数据
  • getAttribute(String name) 通过名字获取值
  • removeAttribute(String name) 通过键名来移除键值对

代码如下:

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("我乃关二爷,需要找三弟借20两");

        //数据共享
        request.setAttribute("money","20两");//存储数据(键名,值)

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}
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 {
    
    

        Object money = request.getAttribute("money");//通过键名获取值

        System.out.println("我乃张飞是也,借你"+money+"两");
    }

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

运行结果如下:

在这里插入图片描述
我们在图1这里看到浏览器地址栏不发生变化
在这里插入图片描述

response重定向特点以及和转发的区别

重定向就是资源跳转的一种方式

重定向的两种设置方式:

  • 方法一:
    1、新建两个servlet文件
    2、servlet1 设置状态码302,response.setStatus(302);
    servlet1设置响应头location,值为 serlvet2的路径,response.setHeader(“location’”,"/servlet2");
  • 方法二:
    response.sendRedirect("/servlet2");

重定向特点redirect :

1、地址栏发生变化
2、重定向可以访问其他服务器的资源,比如:把转发地址写其他网站的http网址
3、定向是两次请求。所以不能用request域来共享数据

猜你喜欢

转载自blog.csdn.net/qq_43928469/article/details/111649277
今日推荐