JavaWeb 转发和重定向数据共享

40 篇文章 0 订阅
32 篇文章 0 订阅

转发:

请求转发,是内部资源跳转的一个过程。
我们在实际的开发过程中,需要写不同的servlet,每个servlet完成不同的功能,当我们访问test01servlet的时候,test01servelt需要跳转到一个新的test02servlet里面,这就是资源跳转的方式,就用到了请求转发。

原理图:
在这里插入图片描述

实例:

test01:

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("/forward01")
public class Servlet_forward01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("我是Servlet转发01");
//        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward02");
//        requestDispatcher.forward(request,response);

//        response.sendRedirect("/forward02");

        //   动态获取虚拟目录
        String contextPath = request.getContextPath();
        response.sendRedirect(contextPath+"/forward02");
    }

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

test02:

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("/forward02")
public class Servlet_forward02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("我是转发过来的02页面");

    }

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

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


特点:

转发只是一次请求,多个资源之间使用同一个请求


重定向数据共享:

重定向:

重定向:一个web资源收到客户端的请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。

数据共享:

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

  • 存储数据:setAttribute
  • 通过名字获取值:getAttribute
  • 通过键名移除键值对:removeAttribute

原理图:
在这里插入图片描述


实例:

test01:

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

@WebServlet("/test01")
public class Servlet_test01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setStatus(302);
        response.setHeader("location","/test02");

        //   设置响应体,以流的方式输出
        PrintWriter writer = response.getWriter();
        writer.write("wo ai ni");

        //   以字节流的方式传输
        ServletOutputStream os = response.getOutputStream();
        os.write("wo ai ni".getBytes("utf-8"));


    }

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

test02:

@WebServlet("/test02")
public class Servlet_test02 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);
    }
}

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试是否能共享数据:

test03:

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 Servlet_test03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("test03来了");
        //   重定向
        //  1
//        response.setStatus(302);
//        response.setHeader("location","/test04");
        //  2
//        response.sendRedirect("/test04");
        //  3
//        response.sendRedirect("http://www.baidu.com");

        //   测试是否能共享数据
        request.setAttribute("user","Username cs");
        System.out.println("得到的共享数据Servlet03中:"+request.getAttribute("user"));
    }

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

test04:

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 Servlet_test04 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("重定向到了test04");

        Object user = request.getAttribute("user");
        System.out.println("通过获取共享数据user:"+user);

    }

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

结果如下:
在这里插入图片描述
在这里插入图片描述

结果显示:

重定向不能共享数据!


特点:

重定向是两次请求,所以不能用request域共享资源
重定向可以访问其他服务器的资源
地址栏发生变化

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值