导图社区 Tomcat——Servlet规范
对servlet规范的各个知识点进行梳理,Tomcat是实现Servlet规范的容器。
编辑于2019-10-16 08:59:38Tomcat——Servlet规范
场景
Java体系的Web服务器
Tomcat
线程安全
一般来说,在Servlet容器中,每个Servlet类只能对应一个Servlet对象,所有请求都由同一个Servlet对象处理
不安全
但如果Servlet实现了SingleThreadModel接口则可能会在Web容器中存在多个Servlet对象,实现了SingleThreadModel接口意味着一个Servlet对象对应着一个线程,所以此时Servlet的成员变量不存在线程安全问题
安全
生命周期
包括加载实例化
由Web容器完成
初始化
init
ServletConfig类型为参数
Web.xml
处理客户端请求
service
ServletRequest
ServletResponse
销毁
destroy
Servlet从Web容器中移除
Servlet的方法
Servlet接口
GenericServlet
通用的、协议无关的Servlet
HttpServlet
定义了HTTP的Servlet
service方法
GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE
doGet、doPost、doPut、doDelete、doHead、doOptions、doTrace
ServletRequest接口
内容
实现类封装了客户端请求的所有信息
方法
请求头部的获取方法
getHeader
getHeaders
getHeaderNames
获取请求路径的方法
getContextPath
getServletPath
getPathInfo
requestURI=contextPath+servletPath+pathInfo
获取Cookie的方法
getCookies
判断标识是否为HTTPS的方法
isSecure
获取客户端语言环境的方法
getLocale
getLocales
Accept-Language头部
获取客户端编码的方法
getCharacterEncoding
Content-Type头部
作用域
只在Servlet的service方法或过滤器的doFilter方法作用域内有效
除非启用了异步处理以调用ServletRequest接口对象的startAsync方法,此时request对象会一直有效,直到调用AsyncContext的complete方法
出于性能原因而不销毁ServletRequest接口的对象,而是重复利用ServletRequest接口对象
ServletContext接口
内容
某个Web应用的Servlet全局存储空间
所有Servlet共有的各种资源和功能的访问
获取Web应用的部署描述配置文件的方法
getInitParameter
getInitParameterNames
添加Servlet到ServletContext里面的方法
addServlet
添加Filter(过滤器)到ServletContext里面的方法
addFilter
添加Listener(监听器)到ServletContext里面的方法
addListener
全局的属性保存和获取功能
setAttribute
getAttribute、
getAttributeNames
removeAttribute
访问Web应用静态内容的方法
getResource
getResourceAsStream
以路径作为参数进行查询,此参数要以“/”开头
相对于Web应用上下文的根或相对于Web应用WEB-INF/lib目录下jar包的META-INF/resources
Servlet容器必须为每个ServletContext分配一个临时目录,并可在ServletContext接口中通过javax.servlet.context.tempdir属性获取该目录
ServletResponse接口
内容
服务器要返回客户端的所有信息
输出缓冲
getBufferSize
获取缓冲区大小
setBufferSize
设置缓冲区大小
flushBuffer
强制刷新缓冲区
resetBuffer
清空缓冲区中的内容,但不清空请求头部和状态码
isCommitted
判断是否有任何响应字节已经返回给客户端
reset
清空缓冲区内容,同时清空头部信息和状态码
当ServletResponse接口关闭时,缓冲区中的内容必须立即刷新到客户端
方法
实现对象为HttpServletResponse
添加头部
setHeader
addHeader
将客户端重定向
sendRedirect
错误信息输出到客户端
sendError
作用域
只在Servlet的service方法或过滤器的doFilter方法的作用域内有效
除非它关联的ServletResponse接口调用了startAsync方法启用异步处理,此时ServletResponse接口会一直有效,直到调用AsyncContext的complete方法
出于性能原因而不销毁ServletResponse接口对象,而是重复利用ServletResponse接口对象
Filter接口
说明
允许Web容器对请求和响应做统一处理
作用域
某个Servlet或一组Servlet
过程
Web应用部署完成后,必须实例化过滤器并调用其init方法。当请求进来时,获取第一个过滤器并调用doFilter方法,接着传入ServletRequest对象、ServletResponse对象及过滤器链(FilterChain),doFilter方法负责过滤器链中下一个实体的doFilter方法调用。当容器要移除某过滤器时必须先调用过滤器的destroy方法
配置
XML配置形式使用<filter>元素定义,包括<filter-name>、<filter-class>和<init-params>子节点,并使用<filter-mapping>定义Web应用的Servlet和其他静态资源通过过滤器
@WebFilter注解方式
会话
说明
Servlet没有提出协议无关的会话规定,而是每个通信协议自己规定
HTTP对应的会话接口是HttpSession
会话跟踪机制
Cookie
Cookie的标准名字必须为JSESSIONID
URL重写,即在URL后面添加一个jsessionid参数
当支持Cookie和SSL会话的情况下,不应该使用URL重写作为会话跟踪机制
会话ID方法
获取
HttpSession.getId()
改变
HttpServletRequest. changeSessionId()
通知
HttpSessionBindingListener接口
valueBound和valueUnbound分别会在对应时刻触发
超时
HttpSession的getMaxInactiveInterval方法获取和setMaxInactiveInterval方法设置
边界
ServletContext级别
会话里面的属性不能在不同ServletContext之间共享
分布式
分布式容器迁移会话时会通知实现了HttpSessionActivationListener接口的所有会话属性
请求分发器
作用
把请求转发给另外一个Servlet处理
或在响应中包含另外一个Servlet的输出
实现
RequestDispatcher接口
获取方法
getRequestDispatcher方法
以路径
getNamedDispatcher方法
Servlet名称
Web应用
组成
ServletContext对象
Servlet
视图
JSP
工具类
静态文件
客户端Java Applet
WEB-INF
lib
classes
META-INF
存放的项目的一些信息
部署
实例化部署描述文件中<listener>元素标识的每个事件监听器的一个实例
对于已实例化且实现了ServletContextListener接口的监听器实例,调用contextInitialized()方法
实例化部署描述文件中<filter>元素标识的每个过滤器的一个实例,并调用每个过滤器实例的init()方法
根据load-on-startup元素值定义的顺序,包含<load-on-startup>元素的<servlet>元素为每个Servlet实例化一个实例,并调用每个Servlet实例的init()方法
部署描述文件
ServletContext初始化参数
Session配置
Servlet声明
Servlet映射
应用程序生命周期监听器类
过滤器定义和过滤器映射
MIME类型映射
欢迎文件列表
错误页面
语言环境和编码映射
安全配置(包括login-config、security-constraint、security-constraint、security-role-ref和run-as
Servlet映射匹配规则
Web容器尝试匹配一个精确的Servlet路径,如果匹配成功,则选择该Servlet
Web容器递归尝试匹配最长的路径前缀
如果URL最后包含扩展名,例如.jsp,Web容器将试图匹配一个专门用于处理此扩展名的Servlet
如果前三个规则都不匹配,则匹配一个默认的Servlet