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月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
135 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
33 2
|
1月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
51 5
|
1月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
67 1
|
2月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
105 2
|
2月前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
143 2
|
1月前
|
小程序 Java
小程序通过get请求提交数据到java后台
小程序通过get请求提交数据到java后台
30 0
|
5天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
4天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
4天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
下一篇
无影云桌面