* 即超文本传输协议。它规定了浏览器与服务器之间的通讯规则。
* http是基于请求/响应模式的,所以分为请求协议和响应协议
请求内容就是客户端发送给服务器的数据!
1. 请求格式:
1) 请求首行
2) 请求头
3) 空行
4) 请求体(或称之为请求正文)
2. 请求方法
1) 常见请求方法有GET和POST
2) 在浏览器地址栏中发送请求,以及点击超链接都是GET请求
3) 提交表单可以发送GET请求,以及POST请求
4) GET请求没有请求体,但空行是存在的
5) POST请求是存在请求体的
3. 常见请求头
1) Host:请求的服务器主机名
2) User-Agent:客户端浏览器与操作系统相关信息
3) Accept-Encoding:客户端支持的数据压缩格式
4) Connection:客户端支持的连接方式
5) Cookie:客户端发送给服务器的“小甜点”,它服务器寄存在客户端的。如果当前访问的服务器没有在客户端寄存东西,那么就不会存在它!
6) Content-Length:请求体的长度
7) Referer:当前发出请求的地址
Ø 作用1:统计来源
Ø 作用2:防盗链
1. 响应格式:
1) 响应首行
2) 响应头
3) 空行
4) 响应体(或称之为响应正文)
2. 首行:状态码
响应首行的结构:协议及版本 状态码 状态码说明,例如:HTTP/1.1 200OK
1) 200:请求成功
2) 302:请求重定向
3) 304:请求资源没有改变
4) 404:请求资源不存在,属性客户端错误
5) 500:服务器内部错误
3. 响应头
1) Content-Type:响应正文的MIME类型
2) Content-Length:响应正文的长度
3) Set-Cookie:服务器寄存在客户端的“小甜点”,当客户端再次访问服务器时会把这个“小甜点”还给服务器
4) 通知客户端浏览器不要缓存页面的响应头:
a) Expires:-1
b) Cache-Control: no-cache
c) Pragma: no-cache
5) 自动刷新响应头,浏览器会在3秒钟后自动重定向到传智主页
Refresh: 3;url=http://www.itcast.cn
4. 状态码304
1) 相关头信息
a) 在响应头中:Last-Modified,表示当前资源的最后修改时间;
b) 在请求头中If-Modified-Since,表示缓存资源最后修改时间;
2) 含义:表示访问的资源没有改变。
3) 过程
a) 客户端首次访问服务器的静态资源index.html,服务器会把index.html响应给客户端,而且还会添加一个名为Last-Modified的响应头,它说明了当前index.html的最后修改时间
b) 客户端收到响应后,会把index.html缓存在客户端上,而且还会把Last-Modified缓存起来。
c) 客户端第二次请求index.html时,会添加名为If-Modified-Since的请求头,它的值是上次服务器响应头Last-Modified.
d) 服务器将request中获得的时间,以及当前资源的最后修改时间进行比较
e) 如果相同,说明index.html没有改动过,那么服务器不会发送index.html,而是响应状态码304,即通知客户端资源没有改变,你可以使用自己的缓存
1. ServletResponse-->与协议无关的类型
HttpServletResponse-->与http协议相关的类型
2. 发送状态码:
1) endError(int sc) --> 发送错误状态码,例如404、500
2) sendError(int sc, String msg)--> 也是发送错误状态码,还可以带一个错误信息!
3) setStatus(int sc) --> 发送成功的状态码,可以用来发送302
3. 设置响应头:
1) 单值头:setHeader(String name,String value)
2) 多值头:addHeader(String name,String value)
4. 返回响应内容:两个流(两个流不能同时使用)
1) 字节流:ServletOutputStream,用来向客户端发送字节数据。ServletOutputStream out = resopnse.getOutputStream();
2) 字符流:PrintWriter,用来向客户端发送字符数据!需要设置编码。PrintWriter writer = response.getWriter();
1. API:
Ø 获取客户端IP:request.getRemoteAddr()
Ø 请求方式:request.getMethod()
Ø 获取单值头:getHeader(Stringname)
Ø 获取多值头:Enumeration
Ø 获取请求URL:
¨ 获取协:String getScheme()
¨ 获取服务器名:String getServerName()
¨ 获取服务器端口:String getServerPort()
¨ 获取项目名:String getContextPath()
¨ 获取Servlet路径:String getServletPath()
¨ 获取参数部分:String getQueryString()
¨ 获取请求URI:String getRequestURI()(等于项目名+Servlet路径)
¨ 获取请求URL:String getRequestURL()
Ø 获取请求参数:
¨ String getParameter(Stringname) (适用于单值请求参数)
¨ String[]getParameterValues(String name) (适用于多值请求参数)
Ø 获取所有请求参数名称
¨ Enumeration
¨ Map
2. 请求转发和请求包含
1) 获取请求调度器,并与一个Servlet绑定:
RequestDispatcher rd =request.getRequestDispatcher("/MyServlet")
2) 请求转发:rd.forward(request,response);
3) 请求包含:rd.include(request,response);
4) 转发与重定向的区别:
a) 请求转发是一个请求一次响应,而重定向是两次请求两次响应
b) 请求转发地址栏不变化,而重定向会显示后一个请求的地址
c) 请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
d) 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!
3. 解决乱码问题:
两个方面:请求内容乱码、响应内容乱码
1) 解决请求乱码:
GET:String param = newString(request.getParameter(“name”).getByte(“ios-8859-1”),”utf-8”);
POST:request.setCharacterEncoding(“utf-8”);
2) 解决响应乱码问题:Response.setContextType(“utf-8”)
1. 什么是Cookie:Cookie是HTTP协议制定的,先用服务器将Cookie保存到浏览器中,然后下一次浏览器请求服务器时,把上一次请求得到的Cookie归还给服务器。
2. Http协议规定:
1) 1个Cookie最大4KB
2) 1个服务器最多向1个浏览器保存20个Cookie
3) 1个浏览器最多可以保存300个Cookie
3. 作用:服务器使用Cookie来跟踪客户端状态。
4. 使用:
1) 在响应中添加Cookie:response.addCookie()
2) 从请求中获取Cookie:request.getCookies()
// 保存
Cookie c = new Cookie("username", URLEncoder.encode("张三","utf-8"));//出错!
response.addCookie(c);
// 获取
Cookie[] cs = request.getCookies();
if(cs != null) {
for(Cookie c : cs){
if("username".equals(c.getName())) {
String username =c.getValue();
username =URLDecoder.decode(username, "utf-8");
}
}
}
5. 两个重要的方法:
1) Cookie的maxAge:设置Cookie的最大生命周期
a) maxAge>0:浏览器会把Cookie保存到客户机硬盘上,有效时长为maxAge的值决定。
b) maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,浏览器进程结束,同时Cookie也就死亡了。
c) maxAge=0:浏览器会马上删除这个Cookie
2) Cookie的path:浏览器访问服务器的路径,如果包含某个Cookie的路径,那么就会归还这个Cookie
1. 作用:
1) HttpSession是由JavaWeb提供,用来回话跟踪的类。
2) Session是服务器端对象,保存在服务器端。底层依赖Cookie或是URL重写。
3) 服务器会为每个客户端创建一个session对象,并把这个session对象保存到一个Map中,这个Map被称为Session缓存。
2. 原理:
1) 依赖Cookie:request.getSession()方法
Ø 获取Cookie中的JSESSIONID:
Ø 如果sessionId不存在,创建session,把session保存起来,并把sessionId保存到Cookie中返还给浏览器。
Ø 如果如果sessionId存在,通过sessionId查找session对象,如果session失效,创建一个session并保存起来,并把sessionid保存到Cookie中,返还给浏览器。
Ø 如果没失效,则不用创建。
Ø 获得session
PS:如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。
2) URL重写:实现:将页面中的所有路径,都是用response.encodeURL(“url”)处理。
Ø 让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionId
Ø 这样服务器可以通过获取请求参数得到sessionId,从而找到session对象。
Ø response.encodeURL(Stringurl):该方法会对url进行智能的重写:当请求中没有归还sessionid这个cookie,那么该方法会重写url,否则不重写!当然url必须是指向本站的url。
1. 作用:
1) 作为请求发起页面
2) 作为请求结束页面
2. 组成:jsp=html+java脚本+jsp标签
3. jsp原理:jsp其实是一种特殊的Servlet
1) 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)
2) 然后再把java编译成.class
3) 然后创建该类对象
4) 最后调用它的service()方法
5) 第二次请求同一jsp时,直接调用service()方法。
4. 静态包含和动态包含的区别:
1) <%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
2) RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class,他们只是把响应的内容在运行时合并了
5. 九个内置对象:
1) out --> jsp的输出流,用来向客户端响应
2) page --> 当前jsp对象。它的引用类型是Object,即真身中有如下代码:Objectpage = this;
3) config --> 它对应真身中的ServletConfig对象!
4) pageContext --> 一个顶9个!
5) request -->HttpServletEequest
6) response -->HttpServletResponse
7) exception --> Throwable
8) session --> HttpSession
9) application --> ServletContext
6. pageContext
1) Servlet中有三大域,而JSP中有四大域,它就是最后一个域对象!
Ø ServletContext:整个应用程序
Ø session:整个会话(一个会话中只有一个用户)
Ø request:一个请求链!
Ø pageContext:一个jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
2) 作用:域对象
> 代理其他域:pageContext.setAttribute("xxx", "XXX",PageContext.SESSION_SCOPE);
> 全域查找:pageContext.findAttribute("xxx");从小到大,依赖查找!
> 获取其他8个内置对象: