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域来共享数据
扫描二维码关注公众号,回复:
12666002 查看本文章