什么是协议
双方或多方相互约定要遵守的规则叫做协议
HTTP协议就是客户端和服务端通信时发送的数据需要遵守的规则。
HTTP协议中的数据叫做报文
请求的HTTP协议格式 | |
---|---|
请求行:基础设置 | ①请求的方式GET或POST ②请求的路径 /hello/abc ③请求协议和版本号HTTP/1.1 |
请求头:扩展设置,键值对类型数据 | 常见的有: Accept: 表示客户端可以接收的数据类型 Accpet-Languege: 表示客户端可以接收的语言类型 User-Agent: 表示客户端浏览器的信息 Host: 表示请求时的服务器 ip 和端口号 |
请求体(get没有请求体,参数拼接在url后面):数据主体 | 前端表单收集的用户输入的具体信息,就是发送给服务器的主体数据 |
响应的HTTP协议格式 | |
---|---|
响应行:基础设置 | ①响应的协议和版本号 HTTP/1.1 ②响应的状态码 200、404 等 ③响应状态描述符 OK、Not Found等 |
响应头:扩展设置,键值对类型 | 常见的有: Server:表示服务器的信息 Content-Type:响应体的数据类型 Content-Length:响应体的长度 Date:请求响应的时间 |
响应体:数据主体 | 服务器回传给客户端的具体数据 |
GET
POST
响应
常用响应码
类别 原因短语 1xx Informational(信息性状态码) 接受的请求正在处理 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向) 需要进行附加操作以完成请求 4xx Client error(客户端错误) 客户端请求出错,服务器无法处理请求 5xx Server Error(服务器错误) 服务器处理请求出错
200 OK 请求成功 204 No Content 服务器接收的请求已成功处理,但返回的响应报文中不含实体的主体部分,即无资源可返回
一般在只需从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用301 Moved Permanently 永久重定向(请求的资源已被分配新的URL,以后应使用资源现在所指的URL) 302 Found 临时重定向(请求的资源已被分配新的URL,希望用户本次使用新的URL) 304 Not Modified 客户端发送附带条件的请求时,,服务器端允许请求访问资源,但请求未满足条件。304其实与重定向没有关系 400 Bad Request 请求报文中存在语法错误 401 unauthorized 表示发送的请求需要有通过 HTTP 认证的认证信息 403 Forbidden 对请求资源的访问被服务器拒绝了 404 Not Found 服务器上无法找到请求的资源 500 Internal Server Error 服务器在执行请求时发生错误 503 Service Unavailable 服务器暂处于超负载或正在进行停机维护,现在无法处理请求
HttpServletRequest和HttpServletResponse类
HTTPServletRequest类的作用
每次有请求进入到Tomcat服务器中时,Tomcat服务器就会将请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)供我们使用。HttpServletRequest对象可以获取到所有请求信息
HTTPServletRequest类的常用方法
方法 | 作用 |
---|---|
getRequestURI() | 获取请求的资源路径 |
getRequestURL() | 获取请求的统一资源定位符(绝对路径) |
getRemoteHost() | 获取客户端的 ip 地址 |
getHeader() | 获取请求头 |
getParameter() | 获取请求的参数 |
getParameterValues() | 获取请求的参数(多个值的时候使用) |
getMethod() | 获取请求的方式 GET 或 POST |
setAttribute(key, value) | 设置域数据 |
getAttribute(key) | 获取域数据 |
getRequestDispatcher() | 获取请求转发对象 |
用法
Servlet程序
@Override
protect void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
req.getRequestURI();
req.getMethod();
String username =req.getParameter("username");
req.getParameter("password");
String[] hobby =req.getParameterValues("hobby")
System.out.println("兴趣爱好"+(Arrays.asList(hobby));
}
表单
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">Java
<input type="checkbox" name="hobby" value="js">JavaScript<br/>
<input type="submit">
</form>
</body>
解决乱码问题
doGet请求乱码
//先用iso8859-1编码 再用UTF-8解码 String
username=req.getParameter("username");
username=new String(username.getBytes("iso-8859-1·"),"UTF-8)
doPost请求乱码
//直接设置请求体的字符集为UTF-8
req.setCharacterEncoding("UTF-8");
请求转发
服务器收到请求后,从一个资源跳转到另一个资源的操作叫做请求转发
RequestDispatcher reqDisp=req.getRequestDIspatcher(“/servlet2”);
reqDisp.forward(req,resp);
Servlet1程序:
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username);
// 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
req.setAttribute("key1","柜台 1 的章");
// 问路:Servlet2(柜台 2)怎么走
//请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");
// 走向 Sevlet2(柜台 2)
requestDispatcher.forward(req,resp);
}
}
Servlet2程序:
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username);
// 查看 柜台 1 是否有盖章
Object key1 = req.getAttribute("key1");
System.out.println("柜台 1 是否有章:" + key1);
// 处理自己的业务
System.out.println("Servlet2 处理自己的业务 ");
}
}
base标签的作用【【【】】】
HttpServletResponse类的作用
每次请求Tomcat服务器会创建一个Response对象来供Servlet程序使用。HttpServletRequest 封装请求过来的信息,HttpServletResponse 封装返回给客户端的响应信息,可以通过 HttpServletResponse 对象设置返回给客户端的信息
两个输出流
字节流 | getOutputStream() | 常用于下载(传递二进制数据) |
---|---|---|
字符流 | GetWriter() | 常用于回传字符串(常用) |
两个字节流不能同时使用
服务器往客户端回传数据
例:回传字符串数据
public class ResponseIOServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
PrintWriter writer = resp.getWriter();
writer.write("这是一条响应信息");
}
}
解决响应乱码
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
//此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");
//下面这个方法不推荐使用
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头 设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。
resp.sendRedirect("http://local:8080");
//下面这种方法不推荐使用
//设置响应状态码302,表示重定向
resp.serStatus(302);
//设置响应头,说明新地址在哪里
resp.setHeader("Location","http://local:8080");
MIME类型说明
MIME是HTTP协议中的数据类型
全称是Multipurpose Internet Mail Extensions 多功能邮件扩充服务,
MIME类型格式是 大类型/小类型 并与某一种文件的扩展名相对应
文件 | MIME类型 | |
---|---|---|
超文本标记语言文本 | .html , .htm | text/html |
普通文本 | .txt | text/plain |
RTF文本 | .rtf | application/rtf |
GIF图形 | .gif | image/gif |
JPEG图形状 | .jpeg,.jpg | image/jpeg |
au声音文件 | .au | audio/basic |
MIDI 音乐文件 | mid,midi | audio/midi,audio/x-midi |
RealAudio 音乐文件 | .ra,.ram | audio/x-pn-realaudio |
MPEG 文件 | .mpg,.mpeg | video/mpeg |
AVI 文件 | .avi | video/x-msvideo |
GZIP 文件 | .gz | application/x-gzip |
TAR 文件 | .tar | application/x-tar |