Response
响应对象:与状态码有关
HTTP响应格式有三个组成
- 响应行(状态行)
- HTTP/1.1 协议和版本
- 200 状态码
- OK 状态信息
- 响应头:由键值对组成
- 响应体:字符输出流和字节输出流
什么是HttpServletResponse对象
这是一个接口,它的父接口ServletResponse
-
由谁实现:Tomcat
-
由谁创建:Tomcat通过反射来实例化
设置状态码的方法
状态码的方法 | 描述 |
---|---|
setStatus(int status) | 设置状态码 |
sendError(int sc) | 发送错误码,也可以指定错误的信息 |
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo05")
public class Demo05Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置状态码为202,每个状态码都是有自己的定义
//response.setStatus(202);
//设置状态码的错误提示
response.sendError(411,"长度不够");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果
响应对象:响应头相关方法
响应头的方法
响应头的方法 | 描述 |
---|---|
void setHeader(String name, String value) | 设置指定响应头的键和值 |
void setContentType(String type) | 相当于setHeader(“content-type”, “text/html;charset=utf-8”) 设置响应头指定内容类型和编码 如:setContentType(“text/html;charset=utf-8”) |
案例:设置响应头过3秒跳转
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo06")
public class Demo06Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("3秒后跳转");
response.setHeader("refresh","3;url=https://www.baidu.com");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
案例:使用location实现页面跳转
步骤
- 只设置location响应头
- 同时设置302状态码
- 使用重定向的方法跳转
代码
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo07")
public class Demo07Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* //设置状态响应码
response.setStatus(302);
//设置响应头location的 需要配合状态码一起来使用,单独使用时无法跳转。
response.setHeader("location","http://www.baidu.com");*/
//重定向也是通过这样的方式来实现
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
响应头的方法 | 描述 |
---|---|
void setHeader(String name, String value) | 设置指定响应头的键和值 |
void setContentType(String type) | 设置响应内容的类型,相当于: setHeader(“content-type”,“text/html;charset=utf-8”) |
响应体:处理响应乱码的问题
响应体的两种数据
- 字符数据,使用字符流来处理
- 字节数据,使用字节流来处理
response对象的方法 | 描述 |
---|---|
OutputStream getOutputStream() | 获取响应对象的字节输出流,用于处理字节类型的数据,如:图片 |
PrintWriter getWriter() | 获取响应对象的字符输出流,用于处理字符类型的数据,如:网页 |
打印流的一些疑问
字符数据都是有汉字编码,如果使用不同的编码就有可能出现乱码的问题
测试:直接使用打印输出流,输出汉字的结果是什么?
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo08")
public class Demo08Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//直接输出
PrintWriter out = response.getWriter();
out.print("时间管理大师");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果
原因
-
浏览器默认采用的iso—8859-1的编码,不支持中文
-
没有告知浏览器服务器采用的编码格式
解决
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo08")
public class Demo08Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 这是一个网页
//2. 告诉浏览器,服务器端使用的编码是什么
//3. 设置响应体编码,代替了 response.setCharacterEncoding("utf-8")
response.setContentType("text/html;charset=utf-8");
//直接输出
PrintWriter out = response.getWriter();
out.print("时间管理大师");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
URL的编码和解码
为什么需要URL编码和解码
表单中提交汉字,使用GET提交,查看请求行的数据
username=%E5%BC%A0%E4%B8%89 使用的UTF-8编码,一个汉字占3个汉字
有关的方法
URL编码和解码有关的方法 | 功能 |
---|---|
URLEncoder.encode(“字符串”,“urf-8”) | 静态方法通过类名直接调用 URL编码 参数1:要编码的字符串 参数2:固定写成utf-8 |
URLDecoder.decode(“字符串”,“utf-8”) | URL解码 参数1:要解码的字符串 参数2:固定写成utf-8 |
代码
package com.itheima.url;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class TestCode {
public static void main(String[] args) throws UnsupportedEncodingException {
//源字符串
String str = "张三";
//使用URL编码
String encode = URLEncoder.encode(str, "utf-8");
System.out.println("编码以后:" + encode);
//使用URL解码
String decode = URLDecoder.decode(encode, "utf-8");
System.out.println("解码以后:" + decode);
}
}
使用Servlet下载文件
下载设置的响应头
技术点,需要设置以下响应头才可以实现下载
设置响应头 | 参数说明 |
---|---|
Content-Disposition: attachment; filename=文件名 | Content-Disposition: 浏览器打开资源的方式 attachment: 表示以附件的方式下载,而不是打开 filename: 下载到浏览器端使用的文件名 |
步骤
- 从链接上得到文件名
- 设置content-disposition头
- 得到文件的输入流
- 得到response的输出流
- 写出到浏览器端
汉字乱码原理
注:IE、Chrome下载中文采用的是URL编码,注:FireFox不能采用这种方式。
下载的Servlet代码
package com.itheima.servlet;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
@WebServlet("/down")
public class DownServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0.读取浏览器发送的请求数据
String filename = request.getParameter("filename");
System.out.println(filename);
//1.获得上下文对象
ServletContext application = getServletContext();
//2.获取web-inf下目录的资源
InputStream inputStream = application.getResourceAsStream("/WEB-INF/down/" + filename);
//3.得到一个响应字节流
ServletOutputStream outputStream = response.getOutputStream();
//4,设置响应体中下载的格式
response.setHeader("Content-Disposition","attachment; filename="+ URLEncoder.encode(filename,"utf-8"));
//5.将得到的输入流,传入到输出流中
IOUtils.copy(inputStream,outputStream);
//6.关流
inputStream.close();
outputStream.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
//5.将得到的输入流,传入到输出流中
IOUtils.copy(inputStream,outputStream);
//6.关流
inputStream.close();
outputStream.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}