1 http协议
是对浏览器和服务器端数据传输格式的规范!
GET /day08/first HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive |
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 24 Date: Mon, 08 Jun 2015 01:51:04 GMT |
2 http请求(4部分)
GET /day08/first HTTP/1.1 --请求行 Host: localhost:8080 --请求头(以键值对形式出现) User-Agent: Mozilla/5.0 (Windows NT 6.1;WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language:en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive ----一个空行 name=eric&password=123456 --- 实体内容 |
2.1请求行
GET /day08/first HTTP/1.1(注意:这里分为三个部分,空格隔开)
http协议版本:
http1.0:当浏览器和服务器连接之后,在一次连接中只能发出一个请求
http1.1:当浏览器和服务器连接之后,在一次连接中可以发出多次请求。(效率比1.0更高)
请求资源:
请求服务器的哪个资源文件
/day08/first : URI:统一资源描述符。可以描述任何文件,本地,互联网
http://localhsot:8080/day08/first:URL : 统一资源定位符,互联网(基于http协议) ,是URI的子集。
请求方式(提交方式):
http协议中的请求方式:GET、POST、HEAD、PUT、CONNECT。。。。
最常用的的请求方式: GET 和 POST
GET:
1)提交的参数显示到地址栏
原理: get方式提交的参数会跟在请求行内容的URI后面。以?开始,每个参数使用=号分开,name=jacky,第二个参数之后使用&符合连接(GET /day08/testMethod.html?name=jacky&password=123456 HTTP/1.1)
POST:
1)提交的参数不会显示到地址栏
原理:post提交的参数跟在请求的实体内容中。第二个参数用&连接(name=jacky&password=123456 -实体内容)
2.2请求头
Accept: text/html,image/* --浏览器接受的数据类型 Accept-Charset: ISO-8859-1 --浏览器接受数据编码格式 Accept-Encoding: gzip,compress --浏览器接受的数据压缩格式 Accept-Language: en-us,zh- ---浏览器接受的语言 Host: www.it315.org:80 --请求发出的主机和端口(必须) If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器缓存的最后修改时间 Referer: http://www.it315.org/index.jsp -- 当前请求来自于哪里 (防止非法链接) User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器的类型 Cookie:name=eric ---浏览器保存的cookie数据 Connection: close/Keep-Alive ---浏览器和服务器的连接状态。close:关闭。keep-alive:保持连接 Date: Tue, 11 Jul 2000 18:23:51 GMT --请求发出的时间 |
2.3 空行不叙述
2.4 关于实体内容(post才有),get是URI后
get: 放在请求行的URI后面
post: 放在请求的实体内容
reuqest.getParameter("name") 获取一个值的参数
request.getParameterValue("name") 获取具有多个值的参数
request.getParameterNames() 获取所有参数名称
request.getParameterMap() 获取所有参数对象
2.5总结request
/**
* 使用HttpServletRequest获取请求信息
* HttpServletRequest对象:获取请求数据
* 请求行:
* 请求方式: request.getMethod()
* 请求资源: request.getRequestURI() / request.getRequestURL()
* http协议版本: request.getProtocol();
* 请求头 request.getHeader("name")
* request.getHeaderNames()
* 实体内容:
* request.getInputStream();
*/
//1)tomcat服务器接收到浏览器发送的请求数据
//2)tomcat服务器把请求数据封装成HttpServletRequest对象
//3)tomcat服务器调用doGet方法,把request对象传入servlet
(1)因为请求头中全部为键值对,
request.getHeader("name") //表示获取键为name的值
String value = request.getHeader("host");// 根据头名称获取头值
System.out.println("host:"+value);
-------------------------------------------------------------------------------------------------------------------
//遍历所有头
Enumeration<String> enums = request.getHeaderNames();// 获取所有头名称(获取所有键)
while(enums.hasMoreElements()){
String headerName = enums.nextElement();//把键给headerName
String headerValue = request.getHeader(headerName);//根据键获取值
System.out.println(headerName+":"+headerValue);
}
(2)java中读取(上一篇博客8更为详细)
InputStream in = request.getInputStream();//字节流
byte[] buf = new byte[1024];
int len = 0;
while( (len=in.read(buf))!=-1 ){//文件还未结束
String str = new String(buf,0,len);
System.out.print(str);
}
(3)service方法和doXXX方法的关系?
答: 1)service方法是程序的入口。我们的代码逻辑就在这个方法被调用到。
2)在HttpServlet的service方法源码中,根据不同请求方式调用了不同的doXX方法,所以我们在开发servlet的时候,就不需要去覆盖service方法,而是去doXX方法。因为get和post是最常用的的两种请求方式,所以只需要覆盖doGet和doPost方法即可!
3 http响应
HTTP/1.1 200 OK --响应行 Server: Apache-Coyote/1.1 --响应头 Content-Length: 24 Date: Mon, 08 Jun 2015 01:51:04 GMT --一个空行 -实体内容 |
3.1 响应行
http协议版本
状态码:当前服务器处理请求的状态(结果)
常见的状态码:
200 : 请求处理完成,成功返回!
302: 需要浏览器进一步请求,才能完成。
404: 浏览器端的错误。没有找到资源。
500: 服务器端的错误。
状态描述:对状态码的文字补充
3.2 响应头
Location: http://www.it315.org/index.jsp --重定向的地址。结合302状态使用完成重定向的效果 Server:apache tomcat --服务器的类型 Content-Encoding: gzip --服务器发送给浏览器的数据压缩格式 Content-Length: 80 --服务器发送给浏览器的数据长度 Content-Language: zh-cn --服务器支持语言 Content-Type: text/html; charset=GB2312 --服务器发送给浏览器的数据类型和数据编码格式 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --服务器资源的最后修改时间 Refresh: 1;url=http://www.it315.org ---定时刷新或每隔n秒跳转资源 Content-Disposition: attachment; filename=aaa.zip -- 以下载方式打开资源 Transfer-Encoding: chunked Set-Cookie:SS=Q0=5Lb_nQ; path=/search -- 服务器发送给浏览器的cookie数据 Expires: -1 --通知浏览器不使用缓存 Cache-Control: no-cache Pragma: no-cache Connection: close/Keep-Alive 连接状态 Date: Tue, 11 Jul 2000 18:23:51 GMT 响应发出的时间 |
3.3 总结
/**
* 使用HttpServletResponse修改响应数据
* response.setStatus(404) 设置状态码
* response.setHeader("name","value") 修改响应头
* response.getWriter().write() 以字符形式发送实体内容
* response.getOutputStream().write()以字节形式发送实体内容
* 响应头依然是键值对;故修改响应头需要键与值
*
*/
/**
* 请求重定向( 跳转到其他页面 )
* response.sendRedirect("/day08/adv.html");
*原理:1.设置302状态码
* response.setStatus(302);
* 2.设置location响应头
* response.setHeader("location", "/day08/adv.html");*/
*/
package gz.itcast.c_response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 案例【refresh】--定时刷新或每隔n秒跳转页面
* @author 王磊
*
*/
public class ResponseDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//设置refresh响应头
//设置秒数
//response.setHeader("refresh", "2");
//每隔n秒跳转页面
response.getWriter().write("注册成功!3秒之后会跳转到主页");
//设置refresh
response.setHeader("refresh", "3;/day08/adv.html");
}
}
//设置content-type响应,以后会经常用
response.setHeader("content-type", "text/html;charset=utf-8");
//本节最重要的案例
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 案例【Content-Disposition】 -- attachment; filename=aaa.zip -- 以下载方式打开资源
*
*/
public class ResponseDemo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
File file = new File("e:/mm.jpg");
/**
* 告诉浏览器以下载的方法打开
*/
response.setHeader("content-disposition", "attachment;filename="+file.getName());
/**
* 文件下载
*/
//1)读取本地文件
FileInputStream in = new FileInputStream(file);
//2)写出给浏览器(字节内容)
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
//边读边写
while( (len=in.read(buf))!=-1 ){
out.write(buf, 0, len);
}
//关闭
in.close();
out.close();
}
}