HTTPServletRespons
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。
TomCat下Servlet的请求和响应流程
设置HTTP响应
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响 应头和响应体
一、设置响应行
response.setStatus(404); // 设置响应状态码
示例:设置重定向
response.sendRedirect("http://www.baidu.com");
实际上执行的是下面的两行代码
response.setStatus(302); // 设置302响应码
response.setHeader("Location","http://www.baidu.com") // 设置响应头,重定向
1
2
3
4
5
Insert title here6
7
8 恭喜你,注册成功,5秒钟后跳转,如不跳转点击这里!.9
10 window.οnlοad= function(){
11 vartime= 5;12 varsecondEle=document.getElementById("second");13 vartimer=setInterval(function(){14 secondEle.innerHTML=time;15 time--;16 if(time==0){17 clearInterval(timer);
18 location.href="http://www.baidu.com";
19 }20
21 },1000);
22 }23
24
25
26
27
28
JS版跳转页面
二、设置响应头
response.setHeader(Key,Value)
示例:
response.setHeader("refresh","5;url=http://www.baidu.com"); // 设置页面加载后5s跳转到指定url
三、设置响应体
1)返回文本数据
response.getWriter().write("你好,world.");
中文乱码问题
原因:在服务器端有一个Response缓冲区,当我们书写 "你好,world."的时候,会查询ISO-8859-1编码表将其转换成字节形式,但此编码表中没有中文,所以返回的就是一堆?。
解决办法:
response.setCharacterEncoding("UTF-8"); // 设置缓冲区的编码集为UTF-8格式
response.setHeader("Content-Type","text/html; charset=utf-8"); // 设置响应头为utf-8格式
简便模式
response.setContentType("text/html; charset=utf-8");
2)返回字节型(图片等)数据
OutputStream out = response.getOutputStream(); // 字节输出流
示例:传图片文件
String real_path = super.getServletContext().getRealPath("a.png"); // 获取文件的绝对路径
InputStream in = new FileInputStream(real_path); // 字节输入流
OutputStream out = response.getOutputStream(); // 字节输出流
byte[] b = new byte[1024]; // 初始化字节数组
int len = 0;
while((len=in.read(b))!=-1){
out.write(b,0,len); // 写
}
in.close(); // 关闭字节输出流
out.close(); // 这个可以不用写,TomCat会帮我们关的
示例:文件下载案例
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取要下载的文件名称
String filename = request.getParameter("filename");
// 设置下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
response.setContentType(this.getServletContext().getMimeType(filename));
// 设置请求头,告诉客户端该文件不是直接解析,而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 获取文件的绝对路径
String path = super.getServletContext().getRealPath("download/"+filename);
// 实例化文件输入流
InputStream in = new FileInputStream(path);
// 获取文件输出流
OutputStream out = response.getOutputStream();
// 实例化字节数组
byte[] b = new byte[1024];
int len = 0;
while ( (len=in.read(b))!=-1 ){
out.write(b,0,len);
}
in.close(); // 关闭输入流
}
但这样会发现,下载中文名称的文件,下载的文件没有名字,所以我们要根据不同的浏览器对其修改编码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取要下载的文件名称
String filename = request.getParameter("filename");
//如果中文有问题的话,使用下面的代码,修改编码格式
//filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");
//======================= 根据浏览器的不同,进行不同的编码 =======================
//获得请求头中的User-Agent
String agent = request.getHeader("User-Agent");
//根据不同浏览器进行不同的编码
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE浏览器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
}
// 设置下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
response.setContentType(this.getServletContext().getMimeType(filename));
// 设置请求头,告诉客户端该文件不是直接解析,而是以附件形式打开(下载)================== 设置响应头的文件名为编码后的名字
response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
// 获取文件的绝对路径
String path = super.getServletContext().getRealPath("download/"+filename);
// 实例化文件输入流
InputStream in = new FileInputStream(path);
// 获取文件输出流
OutputStream out = response.getOutputStream();
// 实例化字节数组
byte[] b = new byte[1024];
int len = 0;
while ( (len=in.read(b))!=-1 ){
out.write(b,0,len);
}
in.close(); // 关闭输入流
}