-
服务器处理请求的流程:
服务器每次收到请求时,都会为这个请求开辟一个新的线程
服务器会把客户端的请求数据封装到request中,request就是请求数据的载体
服务器还会创建response对象,这个对象与客户端连接在一起,可以用来向客户端发出响应
线程:通俗点说,进程是一个具体的应用程序,线程是进程中的一个分支,为单独完成程序中的某一项或一组功能而存在。
应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。
response其类型为HttpServletResponse
ServletResponse是与协议无关的类型
HttpServletResponse是和http协议有关的类型
- 状态码:200表示成功、302表示重定向、404表示客户端(访问的资源不存在)、500表示服务器端错误
sendError(int sc): 发送错误的状态码
sendError(int sc ,String msg):发送错误的状态码,还带一个错误的信息
sendStatus(int sc):发送成功的状态码
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(name = "AServlet",urlPatterns ="/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendError(404,"你访问的数据就是不给你看");
}
}
- 响应头:头就是一个键值对,可能有一个头一个值,也可能有一个头多个值
setHeader(String name,String value)
:适用于单值得响应头
response.setHeader("aaa","AAA");
setaddHeader(String name,String value)
:适用于多值得响应头
response.addHeader("aaa","AAA");
response.addHeader("aaa","AA");
response.addHeader("aaa","A");
setIntHeader(String name,String value)
:适用于int类型的值得响应头
response.setIntHeader("Content-length","888");
addIntHeader(String name,String value)
:适用于多值得响应头
setDateHeader(String name, long value)
:适用于单值得毫秒的响应头
response.setDateHeader("expires",10006060*24);
addDateHeader(String name, long value)
:适用于多值的响应头
*案例:
发送302,设置Location头,完成重定向
重定向
response.setHeader("Location", "/JavaWebDay10_1/CServlet");
response.setStatus(302);
定时刷新:设置Refresh头
//响应体
PrintWriter writer = response.getWriter();
writer.print(欢迎,5秒后跳转)
//设置名为Refresh的响应头
response.setHeader("Refresh","5;URL=/JavaWebDay10_1/EServlet");
禁用浏览器缓存:Cache-Control、pragma、expires
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");
response.setDateHeader("expires",-1);
<meta>标签可以充当响应头:<meta http-equiv="Content-Type" content="text/html";charset="UTF-8">
response的两个流:
ServletOutputStream,用来向客服端发送字节数据;
ServletOutputStream = response.getOutputStream();
PrintWriter,用来向客服端发送字符数据,需要设置编码,两个流不能同时存在
PrintWriter writer = response.getWriter();
//把一张图片读取到字节数组中
String path = "路径";
Fileinputstream in = new FileInputStream(path);
byte[] bytes = IOUtils.toByteArray(in);//读取输入流内容的字节到字节数组中
快捷的重定向:sendRedirect("路径");