javaweb入门(一)——servlet-05-Response学习

JavaWeb实战:从零搭建小型音乐网站,掌握Servlet、JSP与MVC全链路开发 在JavaWeb开发领域,Servlet和JSP是构建动态网站的核心技术基础。Servlet作为服务器端程序,负责处理HTTP请求和业务逻辑;JSP则用于动态生成HTML页面,实现数据展示。其技术价值在于通过经典的MVC(Model-View-Controller)架构模式,将数据模型、业务控制和视图展示分离,提升了代码的可维护性和可扩展性。这种模式广泛应用于企业级Web应用开发,是理解Spring等现代框架的基石。本文聚焦于一个典型应用场景——音乐网站开发,通过整合数据库连接池(如Druid)优化资源管理 阅读详情

HttpServletResponse

在web服务器接收到客户端的http请求之后,针对于这个请求,web服务器会创建两个类:HttpServletRequest以及HtppServletResponse,其中HttpServletRequest来代表请求,HttpServletResponse用来代表响应。
对于这两个类我们要记住:

  • 如果我们想要获取客户端传来的请求参数,我们需要找的类是HttpServletRequest。
  • 如果我们想要给客户端响应信息,我们需要找的类是HttpServletResponse。

对于HttpServletResponse类,我们习惯于称之为Response,也即响应类。

对HttpServletResponse类中方法的一些简单分类

我们学习一个类最直接有效的方法就是先看他的代码,查看其中具体都有哪些方法,搞明白这些方法的功能都是什么。
首先我们看HttpServletResponse类,我们可以发现它继承的是ServletResponse接口。

我们可以发现,这些方法大多都是get、set以及add方法。那么我们可以将这些方法做一个简单的归类。

负责向服务器发送数据的方法

//	只可以输出字符流数据,即只可以输出字符串
    PrintWriter getWriter() throws IOException;
//	可以输出字符流数据和字节流数据,即字符串和二进制字节流
    ServletOutputStream getOutputStream() throws IOException;

这两个类都是用于获取向服务器输出数据的输出流。
我们需要注意的是:
1.getWriter()方法用于输出字符流数据,getOutputStream()方法用于输出字节流数据。
在这里和大家解释一下什么是字节流数据和字符流数据。
字节流数据其实就是二进制数据,它是以字节为单位,即在很多类中都有的getBytes()方法便是将此类转换为字节流。
字符流数据其实就是我们常用的字符串,它是以字符为单位,例如我们经常使用的String类。

为了更好地理解这两个类,我们可以编写一个案例。

测试getWriter()的Servlet:

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

public class WriterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        由于我们的message中有中文,为了防止乱码,所以要对ContentType进行设置
        resp.setContentType("text/html;charset=UTF-8");
//        获取Writer输出流
        PrintWriter writer = resp.getWriter();
        String message = "你好,我是BugMaker2000";
//      将数据使用输出流输出
        writer.write(message);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

测试getOutputStream()的Servlet:

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class OutputStreamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        对resp的ContextType设置
        resp.setContentType("text/html;charset=UTF-8");
//      获取输出流
        ServletOutputStream os = resp.getOutputStream();
        String message = "大家好,我是BugMaker2000 ";
//      这里在测试时,我发现resp中设置的字符字符标准对outputStream无效
        os.write(message.getBytes());
//      当我们需要outputsStream输出数据时候,我们需要在此设置字节流的标准
        os.write(message.getBytes(StandardCharsets.UTF_8));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

测试结果:
getWriter()的测试结果
在这里插入图片描述
getOutputStream()的测试结果
在这里插入图片描述
通过本次案例我们可以更加直观的了解到两个输出流之间功能上的差别:Writer更加注重字符的输出,OutputStream更加注重对字节的输出。

在OutputStreamServlet类中尽管我们在输出流输出之前对response的ContextType中的字符进行了设置,但是outputStream输出的字节流依然是乱码。只用我们在os.write()中设置好字节流的编码格式输出的中文字符才不会变成乱码。

  1. 一个serlvet中的输出流只可以选择Writer或者outputStream两者其中一种。
    在一个输出流创建完毕之后,它就会随着response发送到客户端,在客户端接收之后,服务器就会自动关闭response中没有关闭的输出流。

负责向浏览器发送响应头的方法

	//这些是 SerlvetResponse的方法
	void setCharacterEncoding(String var1);

    void setContentLength(int var1);

    void setContentLengthLong(long var1);

    void setContentType(String var1);

	//这些是HttpServletResponse的方法
	void setDateHeader(String var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

    void setIntHeader(String var1, int var2);

    void addIntHeader(String var1, int var2);

设置响应的状态码

	void setStatus(int var1);

关于状态码,我们只需要记住:

  • 200表示响应成功
  • 3XX表示请求重定向
  • 4XX表示找不到资源
  • 5XX表示服务器代码错误

Response常见的应用——下载文件

一般来说我们使用response应用为:向客户端输出消息,客户端下载文件。其实这两个应用的本质都是客户端通过response类获取服务器传来的数据。
我们此处详细讲解一下response完成下载文件的功能。
客户端下载文件,我们需要完成一下几步:
1.设置响应头,使得客户端可以接收下载文件
2.获取文件输入流
3.获取servlet的输出流
4.创建缓冲区,通过缓冲区将文件输出流写入输出流(返回给客户端)
(5.关闭流,我们十分提倡我们自己关闭输入/输出流)
完成的类:

package com.kuang.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileDownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        1.设置浏览器可以接收下载的文件
        resp.setHeader("Content-Disposition","attachment;filename=1.png");
//        2.获取文件作为输入流
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/1.jpeg");
//        3.获取输出流
        ServletOutputStream os = resp.getOutputStream();
//        4.创建缓冲区,通过缓冲区将文件输入流写入响应输出
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = is.read(buffer)) > 0){
//            将文件输出给客户端
            os.write(buffer,0,len);
        }
//        关闭流
        is.close();
        os.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

实现结果:
当我们运行下载文件的serlvet之后,浏览器就会新建下载任务
在这里插入图片描述
关于这个案例,我们需要知道这些知识点:
1.关于设置浏览器下载文件的语句

        resp.setHeader("Content-Disposition","attachment;filename=1.png");

只有在我们设置了响应头之后,浏览器才会出现新建下载任务的窗口,否则浏览器只会展示图片。要注意其中的filename=1.png,filename=之后的内容是根据我们需要下载的文件名而改变的。
2.获取文件作为输入流
我们需要知道,获取文件作为输入流不仅仅可以通过ServletContext.getResourceAsStream来完成。我们也可通过new一个FileInputStream来完成。

FileInputStream fis = new FileInputStream(filepath);//参数是文件路径

3.关于文件输入流的输入方法inputStream.read()
我们把文件输入流通过缓冲区写入输出流的代码:

        int len = 0;
        while((len = is.read(buffer)) > 0){
//            将文件输出给客户端
            os.write(buffer,0,len);
        }

这段代码可以说是将文件输入流转换为输出流的固定格式,在服务器文件下载中经常使用,需要我们记住。
其中的is.read()方法的作用是:如果参数是byte[],那么将从输入流中获取下一段最多长度是byte[].length的字节(也有可能不够这么多),将其存放在byte[]中,将实际读取的字节数作为int类型返回,如果输入流之后没有字节,那么返回值为-1。
4.我们一定要养成在使用完流之后手动将它关闭的好习惯。
5.如果我们想要下载的文件名称是中文的话,我们下载的文件名会是乱码,这个时候需要我们将响应头的设置修改一下:

        String filename = "中文名字.jpeg";
        resp.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));

需要注意的是,SerlvetContext.getResource()中的路径是可以带有中文的,所以在将中文名称的文件作为文件流导入时直接将filename输入进去就可以了。

InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/" + filename);

在这里插入图片描述
而且我们需要知道,就算我们没有对response的响应头做处理中文乱码的设置,文件也是可以正常下载的,仅仅只是名字是乱码。

JavaWeb数码推荐平台:手写Servlet+JSP实现协同过滤 JavaWeb 是指基于 Servlet、JSP 和 JDBC 的经典 Java Web 开发范式,其核心在于显式控制请求生命周期、数据持久化与视图渲染链路。相比 Spring Boot 的自动装配,JavaWeb 强制开发者理解 DispatcherServlet 拦截机制、HTTP 会话管理、手动 SQL 建模及 JSP EL 渲染原理,特别适合需讲清技术细节的毕业设计与底层能力补全场景。在数码产品推荐领域,该架构支撑用户行为建模、冷启动处理与实时推荐调度,典型落地包括基于 UserCF 的协同过滤算法 阅读详情

相关推荐

【扩展卡尔曼滤波器EKF】基于UWB雷达的SLAM能够在室内环境内映射自然点地标,并改善机器人定位(Matlab代码实现)

内容概要:本文档提供了名为“Plecs全桥LLC谐振变换器仿真模型”的资源,主要用于电力电子领域中LLC谐振变换器的建模与仿真研究。该模型基于Plecs软件平台构建,聚焦于全桥LLC拓扑结构,涵盖其工作原理、关键参数设计及动态性能仿真,帮助用户深入理解LLC谐振变换器在软开关、高效率功率转换方面的特性与实现方法。文档内容包括系统建模、主电路参数计算、控制策略实现以及仿真结果分析等部分,适用于高频高效电源变换器的研发与教学实践。; 适合人群:具备电力电子与电力系统基础知识,从事电源变换器设计、仿真与优化工作的工程师及高校研究生。; 使用场景及目标:① 掌握LLC谐振变换器的工作机理与Plecs仿真建模流程;② 学习全桥LLC拓扑的参数设计与软开关实现方法;③ 为高频高效DC-DC变换器的科研、课程设计或工程项目提供仿真基础和技术参考。; 阅读建议:建议结合电力电子技术教材与Plecs官方文档同步学习,重点理解谐振腔参数(如Lr、Cr、Lm)对增益特性与软开关的影响,并通过调整仿真参数验证不同工况下的系统响应,以加深对LLC变换器设计规律的理解。

【JavaWeb】一文搞懂Response

Hey,一篇Response的用心文章,不来看看吗?

游坦之的博客 1027

elasticsearch-6.5.4集群部署(图文详细)及常见错误

目录 服务器规划 部署包下载 服务器初始化(所有节点都要操作) 内核参数修改 /etc/security/limits.conf修改 /etc/sysctl.conf文件修改 禁用selinux 关闭防火墙 创建es用户 安装jdk es部署 单节点(节点1)部署 部署包上传解压 配置文件修改 修改文件属组 部署包分发 单节点(节点2)部署 配置文件修改 修改文件属组 单节点(节点3)部署 配置文件修改 修改文件属组 启动ES集群 验证 单节点验证 查看集

夜灬狼丶 1977

JavaWeb笔记05

<head><head><body></body>

wei387245232的博客 969

【数据结构】平行四边形数量

平行四边形个数,哈希表,散列

cyy010617的博客 4009

EtherCAT FOE从站开发实战:SSC工具包实现固件在线升级与文件传输

EtherCAT从站开发中,固件在线升级与文件传输是常见需求。FOE(File Access over EtherCAT)作为邮箱通信协议,在实时总线上提供可靠的文件读写通道,与PDO、DC同步共存。其原理基于SM邮箱和状态机,通过SSC工具包可快速启用。技术价值在于无需拆机即可更新固件、导出日志,提升产线效率。应用场景包括伺服驱动器、IO模块等从站的固件升级与参数配置。本文深入讲解从站侧FOE读写实现、主站调用及工程化建议,助力嵌入式工程师高效开发。

weixin_29169899的博客 127

【JavaWeb】--05.Request和Response、JSP、会话技术

JavaWeb笔记

qq_46656857的博客 1871

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

JavaWeb学习日记05-JSP入门

JavaWeb学习日记05-JSP入门 JSP:入门学习 1. 概念: * Java Server Pages: java服务器端页面 * 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码 * 用于简化书写!!! 2. 原理 * JSP本质上就是一个Servlet 3. JSP的脚本:JSP定义Java代码的方式 1. <% 代码 %&g...

weixin_44030726的博客 179

美亚杯取证比赛必备:Veracrypt挂载+检材解压保姆级教程(附常见错误排查)

本文提供美亚杯数字取证竞赛的Veracrypt挂载与检材解压保姆级教程。详细解析从分卷压缩包解压(密码格式为MeiyaCup+年份)到使用Veracrypt正确挂载加密容器的全流程,并附有常见错误排查与高级应急方案,帮助选手高效突破技术门槛,顺利进入取证分析阶段。

alice7model的博客 1033

工业级隔离CAN FD收发器ISO1042设计实战:从原理到EMC防护

在工业自动化与伺服驱动系统中,CAN总线是实现设备间可靠通信的关键技术。其核心原理是通过差分信号传输和仲裁机制,在复杂电磁环境中实现多节点实时数据交换。这项技术的核心价值在于为高噪声、高干扰的工业现场提供了稳定、确定性的通信基础,是构建分布式控制系统不可或缺的环节。其典型应用场景包括新能源汽车电池管理、工业机器人伺服控制以及光伏逆变器集群通信等。本文将聚焦于如何通过高性能隔离CAN FD收发器(如TI的ISO1042)来应对地电位差、浪涌和高压串扰等现场挑战,深入解析其集成的电气隔离、±70V总线故障保护和

weixin_26834815的博客 385

JavaWeb

JavaWeb 本文就是个人自己入坑记的笔记 (相关内容参考自狂神说b站视频 https://www.bilibili.com/video/BV12J411M7Sj) 1. http 1.1 什么是http http(超文本传输协议)是一个简单的请求-响应协议,通常运行在TCP上 文本: html 字符串 超文本:图本,音乐,视频,定位,地图 80 https:安全的 443 1.2 两个时代 http1.0 HTTP/1.0:客户端介意与web服务器连接后 只能获得一个web资源,断开连接

qq_38589743的博客 536

基于STM32姿态解算-正点原子ATK-IMU901模块标准库开发——正点原子串口角度传感器模块十轴IMU加速度气压计陀螺仪_资料编号29

购买了正点原子的ATK-IMU901模块后,发现例程给的是HAL库的,本项目将HAL库例程转换为库函数版本(基于STM32)。实战开发,亲测无误。

嵌入式阿齐Archie 3863

【JavaWeb】Response解析

Response 2.1 Response的概述 2.1.1 Response的概念 在Servlet API中,定义了一个HttpServletResponse接口(doGet,doPost方法的参数),它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为响应行、响应头、响应体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应头、响应体的方法 用我们自己的话说: Response就是服务器端一个对象,它里面可以封装

runofsun的博客 1286

Python 爬虫实战:共享单车数据采集全流程与市场洞察深度剖析

本文介绍了如何利用Python爬虫技术获取和分析共享单车运营数据。文章从项目背景出发,详细阐述了系统架构设计,包括数据抓取、清洗存储、分析和可视化模块。通过Scrapy、BeautifulSoup等工具实现数据采集,使用Pandas进行数据清洗,并借助Matplotlib进行可视化分析。实战部分展示了爬虫代码示例和城市分布、使用频率等分析案例。最终指出数据驱动分析有助于了解行业现状和市场趋势,未来可结合机器学习等方法进行深入洞察。该技术方案为共享单车行业研究提供了有效的数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2232

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JavaWeb之Request对象和Response对象详解

一:概述 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象 一、Response对象     1.Resonse的继承结构:             ServletResponse--HttpServletResponse     2.Response代表响应,于是响应消息中的 状态码、响应头、实体

缘 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Servlet基础入门到精通核心编程实战教程

Servlet基础入门到精通高级核心编程实战精讲课程视频教程。详细讲解了Servlet从入门到精通的核心知识,通过学习能够快速入门JavaWeb,作为入门基础核心课程,讲解细致,值得学习! 课程内容如下: 课程目录 00-servlet系列课程的要求及规范 01-servlet与http的简单介绍 02-http协议的特点 03-http协议交互过程及请求详解 04-http协议响应详...

qq_35238997的博客 269

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaWeb_05

HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体,对于这三部分内容的数据,respone对象都提供了哪些方法来进行设置?响应行响应头响应体对于响应体,是通过字符、字节输出流的方式往浏览器写,获取字节输出流介绍完这些方法后,后面我们会通过案例把这些方法都用一用,首先先来完成下重定向的功能开发。

2401_88278776的博客 376

《JavaWeb系列教程》

包含Tomcat、Servlet、Http协议、Request、Response、ServletContext、Cookie、Session、JSP、EL表达式、JSP常用标签库、JSP内置函数、MVC架构、Filter、Listener、Ajax等知识点系列教程配套代码。

緑水長流*z 1万+

【学习笔记】javaweb Response

Response简介 在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法 以setXxx()方法为主 设置响应行 响应行构成: 常用状态码: 设置方法: setStatus(int status)方法 200 302 304 sendError(int sc)方法

Noob小叮当的博客 156

javaWEB学习日记day05

复习: HttpServletRequest 请求行: * getMethod() * getRquestURL() * getRquestURI() * getContextPath() --获取虚拟目录 * getServletPath() * getQueryString --> get请求方式的参数 username=lucy&password=123 请求头: * getHeader(name) 请求体: 输入流 post方式的参数 * getRea...

azure10492的博客 155

JavaWeb-05-Servlet

1.Servlet简介 servlet就是sun公司开动态web的一门技术 sun公司在这些API中提供了一个接口叫做:servlet,如果想开发一个servlet程序,只需要完成两个小步骤: 1.编写一个类,实现servlet接口 2.把开发好的Java类部署web服务器中 把实现了servlet接口的java程序叫做:servlet 1.2HelloServlet Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServ... 响应中文乱码

習習君的博客 430

JavaWeb 04 Web核心 HTTP Tomcat Servlet

01-Web核心介绍02-HTTP简介数据传输的规则。

我亦无他,唯手熟尔 409

JavaWeb学习__第4天__response与request

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。     request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。 1.response     Response代表响应,于是响应消

有志者、事竟成、破釜沉舟 673

Javaweb学习笔记day07---Web体系Servlet

请求转发 resquest作为域对象 响应对象概述 响应对象之输出内容 响应对象值定时跳转 重定向 资源跳转的路径问题 响应对象之文件下载问题解决

Wynb1020的博客 485
上一篇: javaweb入门(一)——servlet-04-SerlvetContext应用
下一篇: javaweb入门(一)——servlet-06-Response应用的案例——验证码
BugMaker2000
博客等级 码龄7年 84粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值