相对于Servlet 2.5,Servlet 3.0有以下新特性或者不同点:
- Servlet监听器被调用的顺序不再是随机的,而是会按在web.xml,web-fragment.xml或annotations的定义的顺序被执行.
- web.xml中标签<web-app>的metadata-complete属性的配置不但决定是否在deployment时对annotations进行扫描,同时会决定是否对web-fragments.xml进行扫描.
未实现SingleThreadModel接口的普通Servlet类是非线程安全的;因为SingleThreadModel将严重影响Servelt的吞吐量,故不推荐使用该接口.
Http Request Methods:
- Options:返回结果不可缓存;可用来测试目标服务器上的某资源是否可用;可用来定位请求网络链路中某个特定的代理服务器;可用来测试目标服务器的性能.
- Get:返回结果可缓存;通过将数据绑定在URI上来发送请求;用来获取目标URI所对应的所有信息及资源;
- Head:返回结果可缓存;类似于Get,但不要求返回消息主体;可用来测试目标资源是否有效,是否可访问,是否被更新过.
- Post:返回结果一般不可缓存;发送请求时,数据独立于URI;主要用来向目标服务器发送数据.
- Put:返回结果不可缓存;发送请求时,数据独立于URI;如果目标资源存在,则更新;不存在,则创建相应的资源.
- Delete:返回结果不可缓存;删除目标服务器上的URI对应的资源.
- Trace:返回结果不可缓存;用来回显目标服务器收到的请求;易被利用于跨站攻击.
在HttpServlet中定义了getLastModified方法用来响应Conditional Get Request.
对于没有实现SingleThreadModel接口的普通Servlet类,每个servlet container中只能有一个它的实例.对于分布式应用,在每一个JVM中每个普通Servelt类仅有一个实例.
Servelt的生命周期:
- Servelt container可以从本地,远程文件系统或者其它网络服务加载servelt class.
- Servelt初始化失败时,将被servelt container释放,且destroy方法不会被调用.
- 异步处理:在servlet3新增加了对请求的异步处理,提高了servlet container的吞吐能力.
- 使用NIO来管理连接
ServeltRequest:
- 支持上传文件。
- SSL Attributes?
- 在读取request中数据前可通过setCharacterEncoding(String enc)来重新设置数据编码。
ServletContext:
- 支持编程式配置Servelt,Filter。
- 存储在Context的属性,不会被分布式系统中的其它Container共享。
Resources:getResource或者getResourceAsStream
- 会从以Context为根目录的相对路径中获取资源(高优先搜索路径)。
- 或者 WEB-INF/lib中的Jar file中的META-INF/resources中获取资源。