JavaWeb《三》Request请求转发与Response响应

简介: javaweb的第三篇,介绍了Request请求转发与Response响应。

🍎道阻且长,行则将至。🍓

本文是javaweb的第三篇,介绍了Request请求转发与Response响应。
上一篇:JavaWeb《二》Servlet、Request请求
下一篇:敬请期待


@Toc


一、Request请求转发🍏

请求转发(forward)是一种在服务器内部的资源跳转方式。例如浏览器发送请求给服务器,服务器中对应的资源A接收到请求,A处理完请求后将请求发给资源B,B处理完后将结果响应给浏览器,这个过程就是请求转发。
image.png
  • 实现方式:

req.getRequestDispatcher("资源B路径").forward(req,resp);
继续上一篇的,我们创建两个servlet,req1req2,在第一个里面请求转发到第二个;只需要在doGet里面添加request.getRequestDispatcher("/req2").forward(request,response);

  • 转发数据

请求转发资源间共享数据:使用Request对象。
request对象提供的三个方法:
1.存储数据到request域[范围,数据是存储在request对象]中
void setAttribute(String name,Object o);
2.根据key获取值
Object getAttribute(String name);
3.根据key删除该键值对
void removeAttribute(String name);

继续上面代码添加:

//req1
request.setAttribute("msg","hello");
//请求转发
request.getRequestDispatcher("/req2").forward(request,response);
//req2
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);

二、Response对象🍓

Request:使用request对象来==获取==请求数据
Response:使用response对象来==设置==响应数据
image.png

在上一篇中把内容返回到网页上就是一个响应。

1.响应数据

HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体,对于这三部分内容的数据,respone对象都提供了一些方法来进行设置:

  • 响应行

例如一个响应行:HTTP/1.1 200 OK,第一个是协议和版本,第二个是状态响应码,第三是状态码描述。通常是要设置状态响应码:void setStatus(int sc);

  • 响应头

Content-Type: text/html,响应头是一个键值对,设置:void setHeader(String name,String value);

  • 响应体

响应体是通过字符、字节输出流的方式往浏览器写,
获取字符输出流:PrintWriter getWriter();
获取字节输出流:ServletOutputStream getOutputStream();

2.Respones请求重定向

==Response重定向(redirect):一种资源跳转方式。==
image.png

浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B

  • 重定向的实现方式:

给浏览器响应一个302的状态码+location的一个访问资源B的路径

resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");

重定向浏览器地址栏路径会变化,因为进行重定向访问的时候,是浏览器发送两次请求。因此可以使用服务器外部资源。
上一节请求转发不会发生地址栏路径变化,其是服务内部操作。

3.响应字符数据

我们可以在浏览器上显示一些字符,也可以显示带html标签的类型。

  • 返回一个简单的字符串aaa
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("aaa");
  • 返回一串html字符串,并且能被浏览器解析
PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");

4.响应字节数据

  • 将字节数据(图片等)写到浏览器,需要两个步骤:
  1. 通过Response对象获取字节输出流:ServletOutputStream outputStream = resp.getOutputStream();
  2. 通过字节输出流写数据: outputStream.write(字节数据);

实现:

//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff))!= -1){
    os.write(buff,0,len);
}
fis.close();
  • 也可以使用别人提供好的方法来简化代码:
  1. pom.xml添加依赖
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
  1. 调用工具类方法
//fis:输入流   os:输出流
IOUtils.copy(fis,os);

实现:

//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
IOUtils.copy(fis,os);
fis.close();

快来试一试吧!


☕物有本末,事有终始,知所先后。🍭

相关文章
|
1月前
|
Java
java原生发送http请求
java原生发送http请求
|
1月前
|
Java 开发者
java实现Http请求
java实现Http请求
15 0
|
2月前
|
Web App开发 SQL Java
javaweb实现分页(二)
javaweb实现分页(二)
20 1
|
2月前
|
SQL 关系型数据库 MySQL
javaweb实现分页查询(一)
javaweb实现分页查询(一)
20 0
|
1月前
|
JSON Java 应用服务中间件
JavaWeb项目之乱码问题及如何解决
JavaWeb项目之乱码问题及如何解决
|
2月前
|
Java 应用服务中间件 Spring
SpringBoot出现 java.lang.IllegalArgumentException: Request header is too large 解决方法
SpringBoot出现 java.lang.IllegalArgumentException: Request header is too large 解决方法
53 0
|
1天前
|
前端开发 Java 应用服务中间件
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
|
2天前
|
Java 程序员 应用服务中间件
JavaWeb之过滤器(Filter)与监听器(Listener)
本文介绍了JavaWeb中的过滤器(Filter)和监听器(Listener)概念及其使用。过滤器主要用于拦截和处理Web资源请求,如进行编码设置、权限验证等,它在Servlet之前和之后执行。监听器则监听域对象(如ServletRequest、HttpSession、ServletContext)状态变化,分为创建/销毁监听和属性变化监听。监听器在Web.xml中注册后会在相应事件发生时自动执行,例如用于统计网站访问人数或初始化配置。
|
1月前
|
JavaScript 前端开发
javaweb文件上传和下载
javaweb文件上传和下载
|
1月前
|
Java
Java编写Http的Get和Post请求示例代码
Java编写Http的Get和Post请求示例代码
33 2