servlet-3.0 基礎(chǔ)摘要

servlet3.0 的新特性

  • 新增了幾個注解 @WebServlet 、@WebFilter、@WebListener 用來替代之前在web.xml 中的 servlet、filter、listener的配置

  • 動態(tài)新增servlet、filter、listener的能力,這個絕對是開創(chuàng)性的,在servlet2.0時代,一旦servlet容器啟動就沒法在變了。

  • @MultipartConfig 用來簡化servlet中文件上傳的處理

  • 基于plugin模式的開發(fā)模式

使用心得

  1. web.xml 真的能刪掉嗎?
    可以,但是如果你使用maven構(gòu)建工程的話在打包的時候就會遇到問題,因為默認(rèn)情況下maven-war-plugin在打包的時候回去檢查web.xml,如果不存在就立即報錯,因此你的項目無法打包。解決方法是

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>

配置上 failOnMissingWebXml

  1. 動態(tài)新增servlet、filter、listener的能力,是如何做到的?
    在servlet-3.0中增強(qiáng)了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)。

  1. servlet3.0和springmvc結(jié)合
    在springmvc環(huán)境中我們使用spring提供的WebApplicationInitializer來動態(tài)新增servlet、filter、listener。原理就是利用ServletContainerInitializer來實現(xiàn)的,大家可以看下spring-web.jar這個jar包的spi實現(xiàn)。

  2. 基于plugin模式的開發(fā)模式 ?
    簡單說,我準(zhǔn)備一個jar包,里面包含了一個servlet的配置。然后引入這個jar到其他任何一個servlet3的工程里,不需要寫一行代碼,新工程就可以馬上訪問這個servlet了。
    原理是在利用了servlet3提供的web-fragment.xml來實現(xiàn)的,顧名思義web-fragment是web的一個片段,將這個片段放到WEB-INF/下即可

image.png

內(nèi)容是:


image.png

除了標(biāo)記頭和web.xml不一樣,其他都一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,268評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 1. ServletContext接口介紹 ServletContext接口定義了servlet運行時Web應(yīng)用的...
    Lucky_Micky閱讀 1,787評論 0 3
  • 本章聊一聊ServletContext 3.0規(guī)范中定義的注解以及在web應(yīng)用中使用的框架和庫的可插拔性的提升。 ...
    Lucky_Micky閱讀 6,180評論 0 3
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,790評論 11 349

友情鏈接更多精彩內(nèi)容