HttpServletResponse Usage: Sending Data, Managing Encoding, and Implementing File Downloads in Java Servlets
This article explains how HttpServletResponse represents server responses in Java web applications, covering methods for sending data, headers, and status codes, demonstrates outputting Chinese characters via OutputStream and PrintWriter, shows numeric output handling, and provides detailed examples of file download implementations with proper encoding considerations.
HttpServletResponse Overview
The HttpServletResponse object encapsulates the server's response to the client, providing methods to write data, set response headers, and specify status codes.
Key Methods
Methods for sending data ( getWriter() , getOutputStream() ), setting headers ( setHeader() ), and status constants (e.g., SC_OK , SC_NOT_FOUND ) are described.
Common Applications
Outputting Chinese Text with OutputStream
Set the content‑type header to text/html;charset=UTF-8 and write UTF‑8 bytes to the OutputStream to avoid garbled characters.
package gacl.response.study;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo01 extends HttpServlet {
private static final long serialVersionUID = 4312868947607181532L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
outputChineseByOutputStream(response);
}
public void outputChineseByOutputStream(HttpServletResponse response) throws IOException {
String data = "中国";
OutputStream outputStream = response.getOutputStream();
response.setHeader("content-type", "text/html;charset=UTF-8");
byte[] dataByteArr = data.getBytes("UTF-8");
outputStream.write(dataByteArr);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}Outputting Chinese Text with PrintWriter
First call response.setCharacterEncoding("UTF-8") , then obtain the PrintWriter and write the text; the order of these calls is critical.
package gacl.response.study;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo01 extends HttpServlet {
private static final long serialVersionUID = 4312868947607181532L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
outputChineseByPrintWriter(response);
}
public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException {
String data = "中国";
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write("
");
out.write(data);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}Outputting Numbers
Convert numeric values to strings before writing them, e.g., (1 + "").getBytes() , because browsers display only character data.
package gacl.response.study;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo01 extends HttpServlet {
private static final long serialVersionUID = 4312868947607181532L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
outputOneByOutputStream(response);
}
public void outputOneByOutputStream(HttpServletResponse response) throws IOException {
response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream outputStream = response.getOutputStream();
outputStream.write("使用OutputStream流输出数字1:".getBytes("UTF-8"));
outputStream.write((1 + "").getBytes());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}File Download Using OutputStream
Steps: locate the file, set content-disposition header, obtain an InputStream , copy bytes to a buffer, and write them to the response's OutputStream . This approach works for any file type.
package gacl.response.study;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
downloadFileByOutputStream(response);
}
private void downloadFileByOutputStream(HttpServletResponse response) throws IOException {
String realPath = this.getServletContext().getRealPath("/download/1.JPG");
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
InputStream in = new FileInputStream(realPath);
byte[] buffer = new byte[1024];
int len;
OutputStream out = response.getOutputStream();
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}File Download with PrintWriter (Not Recommended)
Using PrintWriter for binary files leads to data loss because it is a character stream; the article demonstrates the problem and advises using OutputStream instead.
package gacl.response.study;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
downloadFileByPrintWriter(response);
}
private void downloadFileByPrintWriter(HttpServletResponse response) throws IOException {
String realPath = this.getServletContext().getRealPath("/download/张家界国家森林公园.JPG");
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
FileReader in = new FileReader(realPath);
char[] buffer = new char[1024];
int len;
PrintWriter out = response.getWriter();
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}Java Captain
Focused on Java technologies: SSM, the Spring ecosystem, microservices, MySQL, MyCat, clustering, distributed systems, middleware, Linux, networking, multithreading; occasionally covers DevOps tools like Jenkins, Nexus, Docker, ELK; shares practical tech insights and is dedicated to full‑stack Java development.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.