吴鹏
总结
--------------------------------------
协议:用来规定双方的责任和义务,需要遵守的规则;
http协议:用来规定浏览器与服务器之间()数据的传递需要遵守的规则;
特点:基于请求和相应的模型;必须得先有请求,然后再有相应;请求和相应必须成对出现;
默认端口号为80;
协议版本:
1.0 :每次相应后即刻关闭了链接;
1.1 :每次响应后不会立即关闭,当等待超过设定时间后才关闭,现在使用该版本协议;
http协议的详解:
抓包分析:GET方式:
* 请求部分:
GET /day09/demo1-http/demo2.html?name=aaa&age=23 HTTP/1.1 请求行:请求方式 请求路径 协议版本
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 59176-10011
Referer: http://localhost:8080/day09/demo1-http/demo1.html
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
DNT: 1
Connection: Keep-Alive
抓包分析:POST方式:
POST /day09/demo1-http/demo2.html HTTP/1.1 请求行:请求方式 请求路径 协议版本
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 59176-10031
Referer: http://localhost:8080/day09/demo1-http/demo1.html
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 15
DNT: 1
Connection: Keep-Alive
Cache-Control: no-cache
name=bbb&age=38
* 响应部分:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"145-1461807615933"
Last-Modified: Thu, 28 Apr 2016 01:40:15 GMT
Content-Type: text/html
Content-Length: 145
Date: Thu, 28 Apr 2016 01:43:52 GMT
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Demo2.html</h1>
</body>
</html>
请求部分:
请求行:请求方式 请求路径 协议版本
请求头:一般都是key:value键值对的形式,一般情况下一个key对应一个一个value,也有一些事一个k对多个v;
请求体:只有POST方法才有请求体;
请求头
都是键值对的形式现实的,一般一个k对应一个v,也有一个k对应多个v;
user-Agent:代表浏览器的类型 --- 个别浏览器在处理某些代码时有区别,比如下载文件,IE使用URLEncoder进行编码,火狐使用Base64;
Referer:记录当前页面的来源---防盗链;
If-Modified-Since:通常与响应中的头Last-Modified一起查找本地缓存;
请求行
提交方式:提交方式有很多,常用的GET,POST
GET 提交的参数会显示到地址栏,POST不会,没有请求体;
POST 提交的大小没有限制,GET有限制;
提交路径:
协议版本:
请求体:
POST提交方式的提交的参数;
相应部分:
响应行:
协议版本 状态码 状态码的描述
状态码: 200 成功;
302 重定向;
304 查找本地缓存;
404 访问资源不存在;
500 服务器内部错误;
响应头:
都是键值对的形式现实的,一般一个k对应一个v,也有一个k对应多个v;
Last-Modified:与请求中的If-Modified-Since一起查找本地缓存;
Content-Dispostion:文件下载时候使用的一个头信息;
Location:重定向的一个跳转路径;
Referesh:定时刷新/定时跳转;
空行
响应体:
响应的页面内容的代码;
-------------------------------------------------
1 前台表单提交数据到后台Servlet
<form action="/self/ServletDemo2" method="post">
姓名:<input type="text" name="name"><br />
年龄:<input type="text" name="age"><br />
<input type="submit" value="提交"/><br>
</form>
上述代码为前端HTML表单的部分代码,其中为了实现表单数据提交的时候提交到我们所实现Servlet后重写方法的类,
action后面要填入该类的路径,并且不是全部的路径,而是/项目名称/实现类名称;这样,在我们填写完信息后,点击提交的时候,
数据才会传入实现后的类;
Servlet对请求的数据进行处理
首先,我们要先在实现类中接收传过来的数据,然后才能处理数据,处理数据的为服务器端,传入数据的为客户端,在这里的数据传输属于请求,因此,
我们获取数据就要使用req的方法,其中,我们常用的方法为 String req.getParameter(String name),如果是复选框的话,
使用String[] req.getParameterValues(String[] name);形如:
String name = req.getParameter("name");
int age = Integer.parseInt(req.getParameter("age"));
要注意的是,传输的数据都是属于String类型,为了向上面代码里那样获得int类型的数据的话,要使用Integer.parseInt()方法;
我们还可以使用Map<String,String[]> map = req.getParameterMap();
这样会将前端代码中,name的值放进key,value的值放进value里,
将结果响应给前台
获得数值后,我们可以对其进行操作,在这边我就将其打印到前端,打印到前端属于服务器响应,因此我们可以使用
res.getWriter().println(String name)方法,将得到的数据打印到前端页面;代码实现:
res.getWriter().println(name);
res.getWriter().println(age);
|