servlet3.0 的新特性
新增了幾個注解 @WebServlet 廊营、@WebFilter仔燕、@WebListener 用來替代之前在web.xml 中的 servlet、filter敢靡、listener的配置
動態(tài)新增servlet、filter、listener的能力毒嫡,這個絕對是開創(chuàng)性的,在servlet2.0時代幻梯,一旦servlet容器啟動就沒法在變了兜畸。
@MultipartConfig 用來簡化servlet中文件上傳的處理
基于plugin模式的開發(fā)模式
使用心得
- web.xml 真的能刪掉嗎?
可以碘梢,但是如果你使用maven構(gòu)建工程的話在打包的時候就會遇到問題咬摇,因為默認情況下maven-war-plugin在打包的時候回去檢查web.xml,如果不存在就立即報錯煞躬,因此你的項目無法打包肛鹏。解決方法是
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
配置上 failOnMissingWebXml
- 動態(tài)新增servlet逸邦、filter、listener的能力在扰,是如何做到的缕减?
在servlet-3.0中增強了ServletContext的功能,增加了幾個方法可以用來新增servlet芒珠、filter桥狡、listener,api如下:
- ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)
- ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
- ServletRegistration.Dynamic addServlet(String servletName, String className)
- <T extends Servlet> T createServlet(Class<T> clazz)
- ServletRegistration getServletRegistration(String servletName)
- Map<String,? extends ServletRegistration> getServletRegistrations()
簡單的說皱卓,只要我們能拿到ServletContext對象裹芝,就可以隨時隨地的新增servlet、filter好爬、listener局雄,那么哪些地方可以得到ServletContext對象呢?
1存炮、servletContextListener 啟動的時候可以得到該對象炬搭,這個很簡單。
2穆桂、servlet 3.0 新增了一個新的接口:ServletContainerInitializer 宫盔,這個接口是在容器啟動的時候會掃描claspath下所有實現(xiàn)該接口的實現(xiàn)類,然后調(diào)用onStartup方法享完,在這個類中傳入了ServletContext對象灼芭,因此也可以動態(tài)新增。但這個地方有個問題般又,我實現(xiàn)了這個接口彼绷,servlet容器如何知道呢?他怎么掃描到這個實現(xiàn)類呢茴迁?在META-INF/service中增加配置寄悯,這個其實就是使用了spi原理來做服務(wù)的發(fā)現(xiàn)。
servlet3.0和springmvc結(jié)合
在springmvc環(huán)境中我們使用spring提供的WebApplicationInitializer來動態(tài)新增servlet堕义、filter猜旬、listener。原理就是利用ServletContainerInitializer來實現(xiàn)的倦卖,大家可以看下spring-web.jar這個jar包的spi實現(xiàn)洒擦。基于plugin模式的開發(fā)模式 ?
簡單說,我準(zhǔn)備一個jar包怕膛,里面包含了一個servlet的配置熟嫩。然后引入這個jar到其他任何一個servlet3的工程里,不需要寫一行代碼褐捻,新工程就可以馬上訪問這個servlet了邦危。
原理是在利用了servlet3提供的web-fragment.xml來實現(xiàn)的洋侨,顧名思義web-fragment是web的一個片段舍扰,將這個片段放到WEB-INF/下即可
內(nèi)容是:
除了標(biāo)記頭和web.xml不一樣倦蚪,其他都一樣。