一、HttpServletResponse对象简介
HttpServletResponse和HttpServletRequest对象是在请求时创建的,并且每次请求都会创建新的HttpServletResponse和HttpServletRequest对象。
HttpServletResponse对象是服务器响应信息的封装,HttpServletRequest对象是客户端请求信息的封装。
HttpServletResponse是服务器响应信息的封装,响应常用的状态码有200:表示响应并处理完成
302:表示请求重定向
404:表示客户端请求有误
500:表示服务器端出现错误
具体的方法可以查看API,这里不多介绍。
二、HttpServletResponse的应用
1、常见的乱码问题
注意:乱码问题的产生通常是字符串的编码格式和页面的编码格式不同。
package test.response;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestResponse1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 我的java页面使用的gbk编码,网页的默认编码格式也是gbk。
* 演示使用的IE浏览器,使用谷歌的话可能会有问题。
* 另外,由于IE的原因,下面错误演示的结果可能和我的结果不同,但是正确演示的结果是相同的
*/
// 测试下面的方法
// 具体测试过程可以参考程序下面的分析
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
public void test5_3(HttpServletResponse response) throws IOException {
String str = "zhong国 "; // 不能有敏感字,所以换成拼音了
//指定服务器的编码格式
response.setCharacterEncoding("gb2312");
response.getWriter().write(str);
}
public void test5_2(HttpServletResponse response) throws IOException {
String str = "zhong国 "; // 不能有敏感字,所以换成拼音了
// 修改网页的编码
response.setContentType("text/html;charset=ISO-8859");
response.getWriter().write(str);
}
public void test5_1(HttpServletResponse response) throws IOException {
String str = "zhong国 "; // 不能有敏感字,所以换成拼音了
response.getWriter().write(str);
}
public void test4(HttpServletResponse response) throws IOException {
/*
* 直接写数字1,并没有显示
* 但是改成1+""字符串的写法就会显示
* 因为直接写1的话,会读取gbk码表中1对应的内容,并不是按照字符串的格式来编码
*/
response.getOutputStream().write(1);
// response.getOutputStream().write((1+"").getBytes());
}
public void test3(HttpServletResponse response) throws IOException {
/*
* 设置网页的编码格式,不止有response.setHeader("content-type", "text/html;charset=UTF-8")方法
* 还可以使用meta 标签模拟响应头
* 使用IE,谷歌的话可能不行
*/
String str = "zhong国"; // 不能有敏感字,所以换成拼音了
// 使用meta标签
response.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=utf-8'>".getBytes());
response.getOutputStream().write(str.getBytes("UTF-8"));
}
public void test2(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
String str = "zhong国"; // 不能有敏感字,所以换成拼音了
// 指定编码格式
response.setHeader("content-type", "text/html,charset=utf-8");
// 这里的text/html和charset=utf-8之间该是 ;符号,可是写成了 , 符号,就会有想不到的错误
response.getOutputStream().write(str.getBytes("UTF-8"));
}
public void test1_2(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
String str = "zhong国"; // 不能有关键字,说以换成拼音了
OutputStream out = response.getOutputStream();
// 设置响应头,指定浏览器的解码格式
response.setHeader("content-type", "text/html;charset=UTF-8");
out.write(str.getBytes("UTF-8")); // 指定了字符串的编码格式
// 因为字符串的编码格式和浏览器的编码格式相同,所以不会乱码
}
public void test1_1(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
String str = "zhong国"; // 不能有关键字,说以换成拼音了
OutputStream out = response.getOutputStream();
out.write(str.getBytes()); // 一种正常显示,不写编码格式以浏览器的默认格式显示。
// 因为我的java页面使用的gbk编码,网页的默认编码格式也是gbk,所以不会乱码
}
}
执行分析过程:
test1_1和test1_2方法是两种不会出现乱码的写法,test1_1方法没有修改页面的编码,所以执行的结果为:
而test1_2方法修改了页面的编码,所以执行后页面的编码也会修改:
test2方法演示了一种编码失误造成的错误,错误的结果可能会因人而异,下面是我的错误结果:
test3方法提供了另外一种修改页面编码的方式,使用meta标签,运行结果:
test4方法演示了直接写数字不显示的错误和解决方法,当直接写数字时,我的运行结果是什么都不显示:
你的结果可能和我的不一样,不过没有关系,只要使用字符串的写法就能显示正确的结果,只要这个结果相同就行:
test5方式是使用getWriter方法直接书写字符串,我们先运行test5_1,结果出现了乱码:
这是为什么呢?查看API文档知道当我们没有指定getWriter方法时,这个方法的默认编码是ISO-8859。这也就导致了服务器端和网页两端的编码格式不一样,所以就显示了乱码。那么我们有两种方式解决问题,1、修改网页的编码格式,2、指定getWriter方法的编码格式。
我们先试试修改网页编码的方法,运行test5_1方法,服务器抛出异常:
方法1不行,我们再试试指定getWriter方法的编码格式,运行test5_2方法。果然没有乱码了。
2、实现文件的下载
先准备好要下载的文件:
servlet代码:
package test.response;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestResponse2")
public class TestResponse2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 具体的执行过程参考下面的分析。
// 这里的测试使用的IE浏览器
}
public void test2(HttpServletResponse response)
throws MalformedURLException, UnsupportedEncodingException, FileNotFoundException, IOException {
// 含有中文的文件
String path = this.getServletContext().
getResource("/download/海龟布偶3.jpg").getPath();
String name = path.substring(path.lastIndexOf("/")+1);
// 如果文件名是中文名字,那么就得进行url编码
// 乱码的只是名字,对名字进行编码设置 使用URLEncoder
response.setHeader("content-disposition",
"attachment; filename="+URLEncoder.encode(name, "UTF-8"));
// response.setHeader("content-disposition",
// "attachment; filename="+name);
// 文件读写
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(path);
out = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read())>0){
out.write(buf, 0, len);
}
} finally {
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}
}
public void test1(HttpServletResponse response) throws MalformedURLException {
// 英文名文件
// 先获取文件的路径
String path = this.getServletContext().getResource("/download/Meizu_big02.jpg").getPath();
// 截取文件名字并输出
String name = path.substring(path.lastIndexOf("/")+1);
System.out.println(name);
// 设置为下载
response.setHeader("content-disposition", "attachment; filename="+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
执行分析:
先下载一个文件名是英文的文件,先执行test1方法,在下载的时候文件名正常显示。
英文名字没有问题,那么试试中文名,运行test2方法,下载的时候文件名乱码了:
因为执行文件名乱码了,所以我们要使用URLEncoder.encode方法对文件名进行编码,然后再次运行,就没有乱码了。
更多的response应用请查看:http://blog.csdn.net/q_sea__/article/details/79376991