Web服务器、Servlet容器、Servlet之间的关系
- Web服务器:直接处理由浏览器发送的请求并解析。如果请求的是静态资源,则将静态资源以http协议返回;如果请求的是动态资源,则将请求传递给Servlet容器进行处理
- Servlet容器:解析请求路径,并根据请求路径调用对应的Servlet的service()方法进行处理。此外,还管理着Servlet的生命周期。
- Servlet:定义着业务的处理逻辑,常用方法为doGet()和doPost(),对应着 HTTP GET 和 HTTP POST 。service()的默认方法会根据请求模式调用对应的doXXX()方法。
ServletException 、UnavailableException
- ServletException:表示处理请求时出现问题,通常对应错误码5XX
- UnavailableException:表示当前时间Servlet不能提供服务,若为临时性的,则返回503,若为永久性的,则执行Servlet的destory()方法,返回404
Parameter、Attribute、Header
- Parameter:客户端请求传递的参数
- Attribute:服务端写入的中间参数,因为服务端没有setParameter()方法,因此将中间参数写入Attribute,供其他模块使用
- Header:请求头
* Parameter 与 Header 支持多个值,set Header 时用逗号连接,请求设置 Parameter 时用 ?key=value1&key=value2
,或?key=value1,value2
过滤器Filter
Filter在Servlet容器和Servlet之间生效。
- 步骤
- 通过链式调用filter
- 传入参数为req、resp、chain。如果要过滤该请求,修改resp后进行return,否则执行chain.doFilter()
- chain.doFilter()执行完成后,此时resp已经修改,在这里可以覆盖resp
- 最后一个Filter的doFilter()调用,请求将会传向目的servlet
- <dispatcher>
- request:每次请求都做过滤
- forward:当请求被转发到该 servlet/url 时,才做过滤
- include:同上,调用include()方法时,才做过滤
Cookie与Session
- url重写
在客户端禁用了cookie的场景下,通过使用encodeURL()或encodeRedirectURL()方法,可以将会话id写入url的参数中(如果header中存在cookie,则不重写,否则执行重写)
- 线程安全
session不是线程安全的
RequestDispacher
RequestDispacher是一个接口,包装了一个Servlet,用于请求的转发。
- forward:当前Servlet不产生response,仅由转发的目标Servlet产生response
- include:response由当前Servlet和转发目标Servlet共同产生
监听器Listener
Listener可以在application、session、request三个对象创建、销毁或者属性改变时,执行特定扩展的方法。是Servlet标准提供的扩展点。 例如统计在线人数,session创建时+1,销毁时-1。