请求转发(forward)与请求包含(include)与重定向(sendRedirect)异同

1、 请求转发(forward)
将A 中存储的值传到B里面去

//A页面
package com.gk.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "AServlet", urlPatterns = "/A")
public class AServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        //使用setAttribute方法设置一个键值对,转发到B
        request.setAttribute("name","张三和李四");
        PrintWriter out = response.getWriter();
        out.println("11111111111111111111");
        request.getRequestDispatcher("B").forward(request,response);
    }
}

//B页面
package com.gk.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "BServlet", urlPatterns = "/B")
public class BServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收传过来的name值
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        String name = (String)request.getAttribute("name");
        PrintWriter out = response.getWriter();
        out.println("222222222222222222222222222");
        //将name所对应的值传到前端
        out.println(name);
        out.flush();
        out.close();
    }
}

运行结果:
在这里插入图片描述
可以看出,请求转发中
1、页面的url并不会改变
2、A中的值并不会显示到页面,显示的是B中的值
3、完成了数据共享

原理:
在这里插入图片描述
2、请求包含(include)

将A 中存储的值传到B里面去(forward改成include)

代码:

//A页面
package com.gk.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "AServlet", urlPatterns = "/A")
public class AServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        //使用setAttribute方法设置一个键值对,转发到B
        request.setAttribute("name","张三和李四");
        PrintWriter out = response.getWriter();
        out.println("11111111111111111111");
        request.getRequestDispatcher("B").include(request,response);
    }
}

//B页面
package com.gk.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "BServlet", urlPatterns = "/B")
public class BServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收传过来的name值
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        String name = (String)request.getAttribute("name");
        PrintWriter out = response.getWriter();
        out.println("222222222222222222222222222");
        //将name所对应的值传到前端
        out.println(name);
        out.flush();
        out.close();
    }
}

结果:
在这里插入图片描述
可以看出,在请求包含中:
1、页面的url不变
2、A页面的数据会被显示出来
3、数据达到了共享(A、B里面的的逻辑都能执行)

原理:
在这里插入图片描述
3、重定向(sendRedirect)
代码:

//A页面
package com.gk.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "AServlet", urlPatterns = "/A")
public class AServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        //使用setAttribute方法设置一个键值对,转发到B
        request.setAttribute("name","张三和李四");
        PrintWriter out = response.getWriter();
        out.println("11111111111111111111");
        response.sendRedirect("B");
    }
}

//B页面
package com.gk.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "BServlet", urlPatterns = "/B")
public class BServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收传过来的name值
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        String name = (String)request.getAttribute("name");
        PrintWriter out = response.getWriter();
        out.println("222222222222222222222222222");
        //将name所对应的值传到前端
        out.println(name);
        out.flush();
        out.close();
    }
}

在这里插入图片描述
由此可得,重定向(sendRedirect):
1、url改变了
2、数据没有发生共享
3、发生了两次请求,两次回应
原理:
在这里插入图片描述
总结:

1、请求转发  req.getResquestDispatcher("请求的路径(如B)").forward(req,resp);

	URL重定向  resp.sendRedirect("重定向的地址(如B)");

2、请求转发和重定向的原理

	请求转发是servlet内部调用

	重定向是两次请求和响应

3、请求转发和重定向的区别:

·	请求转发是一次请求       重定向是两次请求

·	请求转发地址栏不会发生改变       重定向地址栏会发生改变

·	请求转发可以共享请求参数       重定向之后就获取不了共享参数了

·	请求转发不能跨域(不能访问其他服务器连接)       重定向可以跳转外部连接

·	请求转发能转到WEB-INF目录下的文件              
	而重定向不能(WEB-INF目录:不能被外部通过地址直接访问)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值