HTTP是什么
HyperText Transfer Protocol:是由w3c(万维网联盟)指定的一种应用层协议,用来定义浏览器与web服务器之间如何通信以及通信的数据格式。
HTTP如何通信
1.建立连接;
2.打包,发送请求;
3.打包,发送响应;
4.关闭连接
注意:一次请求一次连接,Web服务器可以利用有限的连接为尽可能多的客户端服务。
HTTP数据格式
请求数据:
1.请求行:请求方式+请求资源路径+版本协议
2.消息头(若干):消息头是一些键值对,一般由w3c定义。通信的双方通过消息头来传递一些特定的含义,比如,浏览器可以发送User-Agent消息头告诉Web服务器浏览器的类型和版本。大部分为自动生成,某些时候自己需要添加消息头。
3.实体内容:只有当请求方式为post时,实体内容才会有数据。(即请求参数)
响应数据:
1.状态行:协议类型+版本+状态码+状态描述
2.消息行(若干):Web服务器返回一些消息头给浏览器。例如返回Context-Type消息头,告诉浏览器服务器返回的数据类型和字符集。
3.实体内容:程序处理的结果
注意:HTTP的开发,浏览器和服务器通信的步骤(4步)已经实现了,请求数据打包由浏览器实现,响应数据打包由服务器实现;只是请求数据的内容和相应数据的内容需要由开发者提供。
Servlet如何处理Http协议
如何控制通信数据
· 当Web容器收到一个HTTP请求时,通信数据由Web容器负责封装和提供,这些信息被解释为两个对象
· 与请求数据对应的是HttpServletRequest类型的对象
· 与相应数据对应的是HttpServletResponse类型的对象
protected void service(HttpServletRequest req,HttpServletResponse res){}
HttpServletRequest对象
代表客户端的请求,当客户端通过HTTP协议访问服务器时,请求中的所有消息都封装在这个对象中,通过这个对象的相关方法可以获取请求数据;
· 读取和写入HTTP请求数据(请求行、消息头等)
//消息头
//消息头中的数据按照键值对来存储,相当于map可以遍历
Enumeration<String>e = req.getHeaderNames();
while(e.hasMoreElements()){
String key = e.nextElement();
String value = req.getHeader(key);
System.out.println(key+":"+value);
}
· 取得和设置Cookies
//第一个参数是cookie的名字,第二个参数是cookie的值
//如果值是中文,要使用URLEncoder.encode("","")进行编码:他的第一个参数是value,第二个参数是:编码方式
Cookie cookie = new Cookie(“”,“”);
· 取得路径信息
System.out.println("Servlet路径(就是servlet网名)"+req.getServletPath());
· 表示HTTP会话
System.out.println("协议类型:"+req.getProtocol());
· 请求类型
System.out.println("请求类型:"+req.getMethod());
· 以及其他API
protected void service(HttpServletRequest req,HttpServletResponse res){
//项目名
System.out.println(req.getContextPath());
//Servlet网名
System.out.println(req.getServletPath());
//绝对路径
System.out.println(req.getRequestURI());
//完整路径
System.out.println(req.getRequestURL());
}
· 实现请求转发
HttpServletResponse对象
代表提供给客户端的响应,封装了HTTP的响应数据。通过这个对象可设置状态行、消息头、实体内容。
· 设置对客户端的输出内容
// 设置实体内容
PrintWriter out = res.getWriter();
out.println("<p>Hello</p>");
out.close();
· 设置响应的状态码(解决乱码问题)
res.setContentType("text/html");
· 设置浏览器的解码方式(解决乱码问题)
res.setContentType("text/html;charset=utf-8");
· 设置Cookies
· 实现重定向
res.sendRedirect(String url)
请求方式:
为什么区分请求方式
请求方式是客服端对话服务器时的意向说明,是区分请求种类的关键;不同的请求方式不仅仅是数据传输时会有所不同,在表单提交及服务器处理时都会采用不同的方式,而区分不同种类的请求方式也会使得浏览器采用不同的缓存方式处理后续请求,从而提升响应速度。
请求方式种类
GET:请求指定的资源
POST:向指定的资源提交需要处理的数据
HEAD:要求响应与相应的GET一样,但没有响应体
PUT:上传指定资源
DELETE:删除指定资源
GET请求方式
· 当需要向服务器请求指定的资源时使用的方法;它不应该用于一些会造成副作用的操作中(在网络应用中用它来提交请求时一种常见的错误用法)
· 什么情况浏览器发送GET请求
- 在地址栏输入一个地址
- 点击链接
- 表单默认提交
· 特点
- 会将请求数据添加到请求资源路径的后面(即采用路径传参),所有只能提交少量的数据给Web服务器;
- 请求参数显示在浏览器地址栏上,不安全;
POST请求方式
· 向服务器提交需要处理的数据,这些数据写在请求的内容里,可以导致新资源的产生和已有资源的更新。
· 什么情况浏览器发送POST请求
- 设置表单method属性为POST
· 特点
- 请求参数添加到实体内容中(即使用实体传参),可提交大量数据;
- 不会讲请求参数显示在浏览器地址栏,相对安全;