1.http协议的特点

无连接
一次处理一个请求,处理完就断开连接
无状态
没有记忆能力,完全不知道处理过的请求
媒体独立
可传输任何数据,通过MIME-type描述数据类型

2.消息结构(就像信件)

Request
请求行
请求方式/资源/协议版本
请求头
我是谁(浏览器/操作系统/ip)? 我找谁(host)?想要什么样的结果(格式、语言、压缩方式)?
正文
纯数据
Response
状态行
响应状态码/协议版本
响应头
结果是什么样的(格式、语言、压缩方式、大小)?
正文
纯数据

3.请求方式

GET
查询
POST
新增
PUT
修改(只支持ajax)
DELETE
删除(只支持ajax)
HEAD
查询头(不返回正文)
OPTIONS
询问服务器,支持哪些Request Method
TRACE
回路测试(浏览器不支持)
[可参考]
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

4.响应状态

1xx
消息(临时响应:需要继续处理)
2xx
成功(处理完成:成功)
3xx
重定向(继续处理:转到其它url)
4xx
请求错误(处理失败:请求包含的信息有问题)
5xx
服务器错误(处理失败:软件或硬件有问题)
[可参考]
http://tool.oschina.net/commons?type=5

5.常见的 请求/响应 头

Request Header
host
web服务器地址(ip:port)
user-agent
浏览器信息
referer
发起请求的页面
Response Header
content-length
内容大小
content-disposition
内容的处理方式(下载/直接打开)
expires
资源过期时间【如果未过期、浏览器不发请求】
Request/Response Header
accept/content-type
内容的MIME类型
accept-language/content-language
内容中用的语言
accept-encoding/content-encoding
内容的压缩方式
if-none-match/etag
资源版本(序列值)【如果版本一致、服务器无需返回内容】
if-modified-since/last-modified
资源版本(修改时间)【如果版本一致、服务器无需返回内容】

1.servlet接口

call
web容器在web通信过程中,调用servlet接口
implement
java类实现servlet接口,并在其中处理请求

2.接口内容

service
(核心方法)将web请求交给java,并使用web响应接收处理结果
init/destroy
(很少用)创建/销毁 servlet的2个时间点

3.程序员做什么?

HttpServlet类 -> GenericServlet类 -> Servlet接口
HttpServlet
web容器已经用该类实现了servlet接口、并封装了常用的逻辑
extends HttpServlet
我们只需扩展该类,口语中常被简化为“写servlet类”

4.

http://ip:port/projectName/servletUrl
服务器
http://ip
web容器
:port
项目
/projectName
servlet类
/servletUrl

5.

doXXX()
XXX
HttpServlet类定义了相关方法,与RequestMethod一一对应

6.java跟web容器如何交流

web.xml
全局配置(适用于:数量少、影响广的配置,如:listener、filter)
@注解
单独描述(适用于:数量多、有规律的配置,如:servletUrl)

1.在编写servlet类的过程中,常用到如下逻辑

① 从请求中 读数据
② 向响应中 写数据
③ 在环境中 读取配置信息 & 共享数据 & 与其它servlet配合工作
④ 读写cookie
⑤ 读写会话(给请求做会话标记sessionId,用sessionId关联会话)

2.针对这些逻辑,web容器提供了响应的API

① HttpServletRequest
setCharacterEncoding("utf-8")
getParameter("表单中的参数名")
getParameterValues("表单中的参数名")
getHeader("header名称")
getCookies()
getSession()
② HttpServletResponse
setCharacterEncoding("utf-8")
setContentType("text/html;charset=UTF-8")
getWriter()
setHeader("header名称", "header值")
sendRedirect("其它url")
addCookie(Cookie对象)
③ ServletContext
getInitParameter("web.xml中的参数名")
setAttribute("键", "值")
getAttribute("键")
getRequestDispatcher("/servlet2").forward()
getRequestDispatcher("/servlet2").include()
④ Cookie
new Cookie("键", "值")
⑤ HttpSession
setAttribute("键", 值)
getAttribute("键")
invalidate()

1.listener接口

call
web容器监听到事件后,调用servlet接口
implement
java类实现servlet接口,并在其中处理事件

2.事件有哪些

3个对象
ServletRequest
请求
HttpSession
会话
ServletContext
上下文
2类事件
LifeCycle
创建/销毁
AttributesChange
属性的 增/删/改

3.如何告诉web容器

配置
<listener> <listener-class>
注解
@WebListener

1.filter接口

call
web容器在调用servlet前后,调用filter接口
implement
java类实现filter接口,并在其中过滤 请求/响应

2.区分 请求拦截/响应拦截

chain.doFilter()
作为分隔线
前面的代码过滤请求,后面的代码过滤响应

3.指定要拦截的请求

url-pattern
抒写方式与规则,和servletUrl完全相同,并且支持模糊匹配

4.如何告诉web容器

配置
<filter> <filter-mapping>
注解
@WebFilter

5.如何决定多个filter的执行顺序

与web.xml中的抒写顺序一致

1.如何描述程序中的错误

Exception
代码是用java编写的,因此可以抛出Exception
ResponseCode
通信使用了http协议,因此可以发送ResponseCode

2.错误的传播过程

① 发现Exception
代码错误 / throw Exception()
② 记录Exception
web容器用request.setAttribute()传播相关信息,同时用context.log()记录日志
③ 转换ResponseCode
web容器将异常对应到ResponseCode上 / response.sendError()
④ 呈现 errorPage
web容器输出ResponseCode对应的html页面

3.程序员如何参与?

① 发现Exception
主动throw Exception
② 记录Exception
用request.getAttribute()读取异常信息,同时用其它方式记录日志
③ 转换ResponseCode
主动sendError("4xx/5xx") / setStatus("1xx/2xx/3xx")
④ 呈现 errorPage
重新指定ResponseCode对应的html页面

4.如何参与②和④

				
				

1.servlet与jdbc同等重要,没有servlet就不能进行web通信,没有jdbc就不能访问数据库
2.定义接口是java语言扩展自己能力的一项手段,其实就是从调用接口的软件中“借力”