标签:
1.http协议的简介
协议:双方达成一个共同的目标
http协议:请求和响应的过程中,要遵循一定的数据格式
请求:在浏览器的地址栏输入一个地址,点击回车,这个地址到访问的付服务器,这个过程称为请求
响应:服务器接收请求,根据请求返回数据到浏览器里面进行显示,这个过程响应
特点:请求和响应式同时存在的,先有请求后有响应,http响应式基于tcp协议,默认端口是80
使用命令:telnet模拟http协议
首先连接到tomcat
HTTP/1.0和HTTP1.1区别
使用HTTP1.0如果做出相应离开就断开连接
使用HTTP1.1做出响应不会马上断开
3.http协议的响应有三部分
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"578-1432798092723"
Last-Modified: Thu, 28 May 2015 07:28:12 GMT
Content-Type: text/html
Content-Length: 578
Date: Thu, 28 May 2015 07:49:29 GMT
第一部分:响应行
结构:http版本 状态码 状态码描述
状态码:当前的响应的状态
常见的状态码
200:成功 ok
302:重定向 经常和转发比较,
重定向:在一个请求里面又做了一个请求,请求两次,响应两次
转发:把请求转发,请求一次,响应一次 转发在服务器内部执行
304:查找本地缓存
404:资源找不到
500:服务器内部错误(代码写错)
503:服务器挂了
第二部分:响应头:
三个重要的响应头信息:
Location:经常和302使用一起来实现重定向
代码
//重定向使用状态码 302
response.setStatus(302);
//设置头信息 Location 完成重定向的操作
response.setHeader("Location", "/day07/my/my.html");
Refresh:在页面的定时跳转
response.getWriter().write("页面将在3秒之后跳转..");
//使用Refresh头信息实现定时跳转
response.setHeader("Refresh", "3;url=/day07/other/other.html");
Last-Modified:经常请求里面If-Modified-Since一起使用查找本地缓存
Content-Disposition:做文件下载时候
第三部分:响应体:响应在页面上的内容
重定向和转发区别
在一个请求里面,又做了一次请求
重定向:比如找小文借钱10万,小文没有钱,告诉我小温有钱,我再去找小温,把钱拿到
请求两次,响应两次
转发:比如找张三借钱,但是张三没有钱,张三去帮我找李四借钱,最终把钱给我
请求一次,响应一次
3、If-Modified-Since和Last-Modified查找本地缓存
画图分析执行的过程
比如访问图片,第一次访问时候,在服务器端产生访问时间 使用头信息存储 Last-Modified
给一个响应:首先把图片显示到页面上,携带第一次产生的时间,把时间存到浏览器中 使用 If-Modified-Since
第二次访问图片,请求时候携带第一次这个时间发送请求,到了服务器,拿着请求的时间和服务器上面的时间进行比较,
如果有相同的时间,返回状态码 304,让找本地缓存;如果没有相同的时间,重新请求新的数据
4、web开发中缓存处理
使用快捷键 ctrl f5:表示无缓存刷新
移除项目重新部署,或者找到tomcat的work目录,把work里面内容都删除
直接使用浏览器清除缓存
请求的地址后面加一个随机数 http://127.0.0./day11/1.html?id=随机数
http操作,服务器会每次请求创建一个对象request,同时创建相应的对象response
请求:在浏览器地址输入一个地址,点击回车,访问到服务器,这个过程叫请求
响应:
1.response响应对象
HttpServletResponse对象,达标一个响应
响应行:状态码 setStatus(int sc)
响应头:结构:key value
setHeader(java.lang.String name, java.lang.String value):一个key对应一个value,第一个参数头名称,第二个值key对应的value
setDateHeader(java.lang.String name, long date):毫秒数
setIntHeader(java.lang.String name, int value):int类型
一个key对应多个value
addHeader(java.lang.String name, java.lang.String value):一个key对应多个value。第一个参数头名称,第二个值key对应的多个value addHeader("aa","AA") addHeader("aa","BB") aa:AA,BB
addDateHeader(java.lang.String name, long date)
addHeader(java.lang.String name, java.lang.String value)
响应体:显示在浏览器的里面的内容
getOutputStream() 字节流
getWriter() 字符流
把服务器上的内容显示到浏览器,用response
2.案例一:response的重定向
3.案例二:使用response实现页面的定时跳转
可以在页面标签里面直接做
<meta http-equiv="Refresh" content="3;url=/day09/response/login.html">
4、案例三:使用Response实现禁用浏览器缓存
* 使用到头信息
Cache-Control : no-cache
Pragma : no-cache
Expires: -1 :使用什么方法,setDateHeader("",毫秒数):毫秒数,1970-1-1至今的毫秒数
这些头信息禁用浏览器缓存的效果,在一些版本低的浏览器里面,ie6
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
5、response向页面输出中文问题解决
向页面输出内容 : 有两种方式,使用字节流和字符流输出
使用字节流向页面输出中文
会出现中文乱码?
不一定,和浏览器的默认编码有关
解决乱码问题
首先设置浏览器的编码
设置字节数组的编码
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getOutputStream().write("字节流中文".getBytes("utf-8"));
浏览器的编码和字节数组的编码一致
使用字符流向页面输出中文
使用字符流输出中文会有乱码?
一定会有乱码
字符流会产生一个缓冲区,首先会输出的内容先放到缓冲区里面,通过缓冲区进行输出
response缓冲区会有一个默认的编码 iso8859-1,但是这个编码不支持中文
解决方法
首先设置response缓冲区的编码
response.setCharacterEncoding("utf-8");
设置浏览器的编码
response.setHeader("Content-Type", "text/html;charset=utf-8");
让response缓冲区的编码和浏览器编码一致
6.使用间写的方式
第一个细节问题: 使用字符流向页面输出中文解决,有一种简写方式
//使用一种简写方式
response.setContentType("text/html;charset=utf-8");
第二个细节问题:
字节流和字符流是互斥的,两个流不能在一起使用
第三个细节问题:
"text/html;charset=utf-8",使用分号进行隔开,而不能使用其他的符号
第四个细节问题:
不能使用字符流直接向页面输出数字
使用字符流向页面直接输出一个数字,
到utf-8码表查找数字对应的值,把数字对应的字符输出,而不会直接输出数字
第五个细节问题:
重定向操作时候,简写方式
2.http协议的请求
分别是get和post提交表单,查看请求的数据格式
get提交:在地址栏会携带请求的数据
post提交:在地址栏不会携带数据
http的请求:
http协议的请求三部分组成:
第一部分:请求行
请求行里面包含:请求方式、请求地址、http版本
第二部分:请求头
类似key-value形式,一个key可以对应一个value,也可以对应多个value
三个重要的请求头
Referer:防盗链,得到当前请求的地址
创建两个文件夹 my 和 other
分别创建两个页面 my.html other.html
只能是my文件夹里面的文件才可以访问
只有my文件夹里面的文件才可以访问servlet
User-Agent:获取当前请求的浏览器的信息
If-Modified-Since:经常和响应里面Last-Modified一起使用,用于查询本地缓存
第三部分:请求体
通过post提交的数据 user=lisi
表单提交的方式有很多种,常用的两种 get和post
9、request对象
HttpServletRequest,代表请求对象,父接口是 ServletRequest
10、获取到客户机的信息
获取表单提交方式
getMethod()
获取到请求地址
getRequestURL()
获取到请求的项目名称
getContextPath()
获取请求的客户端的ip地址
getRemoteAddr()
11、获取到请求的头信息
使用方法getHeader("头信息名称");
重要的头信息
Referer User-Agent If-Modified-Since
request.getHeader("Referer");
request.getHeader("User-Agent");
12、获取通过表单提交的数据
方法
getParameter(java.lang.String name)
- 获取表单提交的数据方法,参数输入项name的值
- String username = request.getParameter("username");
getParameterValues(java.lang.String name),返回String[]
- 针对复选框 ,获取多个提交的数据,参数输入项name的值
- //得到复选框里面的所有值
String[] loves = request.getParameterValues("love");
//Arrays
System.out.println(Arrays.toString(loves));
getParameterMap() :返回 Map<java.lang.String,java.lang.String[]>
- 获取表单输入项的name的值,和输入的值
- //得到输入项name的值,和输入的值
Map<String,String[]> map = request.getParameterMap();
//遍历map 有两种
//得到所有的key
Set<String> keys = map.keySet();
//遍历set,得到value ,set遍历有两种方式
for (String key : keys) {
//根据key得到value
String[] values = map.get(key);
System.out.println(key+" :: "+Arrays.toString(values));
}
getParameterNames() : Enumeration<java.lang.String>
- 获取所有表单输入项的name的值
在表单输入项里面,输入中文,出现中文乱码
13、获取表单提交中文数据乱码问题解决
表单提交方式,常用get 和 post
使用post提交中文数据时候乱码问题解决 (设置request缓冲区的编码)
使用post提交数据,放到请求体里面
//post提交中文数据有乱码问题
//request获取通过post提交的数据,也会把数据放到request缓冲区里面
//response缓冲区默认编码是 iso8859-1,而request缓冲区里面默认编码也是iso8859-1,不支持中文
/解决方式:设置request缓冲区的编码
request.setCharacterEncoding("utf-8");
//获取提交的数据有中文
String username = request.getParameter("username");
System.out.println("username:: "+username);
使用get提交中文数据时候乱码问题的解决
get提交数据放到浏览器地址栏里面,对中文数据进行url编码。
三种解决方式:
在tomcat里面配置
找到tomcat目录conf下面server.xml,在配置端口地方,最后加 URIEncoding="utf-8"
首先先对中编码,到servlet里面解码
使用string构造方法编码转换(重点掌握)
username = new String(username.getBytes("ISO8859-1"),"utf-8");
代码:String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"utf-8");
14、request域
域:在一定的范围内,存值和取值
servletContext域:整个web项目
存值:setAttribute
取值:getAttribute
request也是一个域对象
范围: 一次请求
存值:setAttribute
取值:getAttribute
request域对象经常和转发在一起使用
request.getRequestDispatcher("转发的路径 不带项目名称").forward();
创建一个Demo1,在这个servlet里面向request域设置一个值 msg itcast,转发到Demo2
在Demo2,获取通过demo1向request域里面设置的值
15、转发和重定向区别
重定向:
请求两次,重定向的地址带项目名称
转发:
请求一次,转发地址不需要带项目名称
重定向:从一个网站到另外一个网站
转发:请求里面需要带数据
JavaWeb系列之七(response域与request)
标签:
原文地址:http://blog.csdn.net/lois_yue/article/details/46382465