(1)HttpServletResponse简介
Web服务器收到客户端的HTTP请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象。
request和response对象既然代表请求和响应,那么我们要获取客户端提交过来的数据,只要查找request对象就行了。要向客户端输出数据,只需要找response对象就可以了
(2)HttpServletResponse对象介绍
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头、发送响应状态码的方法
1.向客户端发送数据的方法
2.向客户端发送响应头的方法
3.向客户端发送响应状态码的方法
(3)HttpServletResponse对象应用
1.输出中文
不出现乱码的原则就是用什么编码就用什么解码
因为数据需要以二进制字节码形式传输,所以Servlet中的数据必然需要先转换为字节码,这就需要设置编码。编码之后要通知浏览器使用相同的字符集,所以需要通过响应头设置
package com.learn.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FirstServlet
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
OutputStream out = response.getOutputStream();
out.write("测试".getBytes("UTF-8"));
response.setHeader("content-type", "text/html;charset=UTF-8");
out.flush();
out.close();
}
}
结果为:
2.下载文件
因为文件名可能出现乱码,所以需要对文件名进行编码
package com.learn.servlet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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;
/**
* Servlet implementation class FirstServlet
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
downloadChineseFileByOutputStream(response);
}
private void downloadChineseFileByOutputStream(HttpServletResponse response)
throws FileNotFoundException, IOException {
//获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath(
"/WEB-INF/测试图片.jpg");
// 获取要下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
InputStream in = new FileInputStream(realPath);// 获取文件输入流
int len = 0;
byte[] buffer = new byte[1024];
OutputStream out = response.getOutputStream();
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);// 将缓冲区的数据输出到客户端浏览器
}
in.close();
}
}
3.定时刷新网页
1)普通定时刷新
package com.learn.servlet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FirstServlet
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh", "5");
OutputStream out = response.getOutputStream();
out.write((""+new Random().nextInt(10)).getBytes());
out.flush();
out.close();
}
}
2)定时刷新后跳转到指定页面
response.setHeader("refresh", "5;url=/LearnServlet/index.html");
4.请求重定向
请求重定向:一个web资源受到客户端请求后,通知客户端去访问另一个web资源
应用场景:用户登录。即用户首先访问登录页面,登录成功后,就会跳转到某个页面。这个过程就是一个请求重定向的过程
实现方式:response.sendRedirect(String location),即调用Response对象的sendRedirect方法实现请求重定向
原理:实际上就是对Response设置302状态码,并设置location响应头实现
package com.learn.servlet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FirstServlet
*/
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
/*方法一:使用response.sendRedirect*/
// response.sendRedirect("index.html");
/*方法二:设置响应头和重定向地址*/
response.setHeader("Location", "/LearnServlet/index.html");
response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);
}
}