Web容器中DefaultServlet詳解
https://blog.csdn.net/qq_30920821/article/details/78328608
Web容器中DefaultServlet詳解
一、什麼是defaultServlet
我們以最熟悉的Tomcat伺服器為例。我們都知道Jsp和servlet都需要web容器才能執行。但是實際上呢我們的web應用中可以沒有任何servlet或者jsp(至少表面上是這樣的)只需要一個web.xml,設定在servlet 3.0中,這個也可以省略。但是我們同樣可以通過連結來訪問應用內的資原始檔。例如.jpg,.html,.js這類的靜態檔案。這就是DefaultServlet的作用了。它在tomat的安裝目錄下的conf/web.xml中有定義。該web.xml對於所有tomcat載入的的web application都會應用,會和application本身指定的web.xml進行合併。
<!--在conf/web.xml中的DefaultServlet的定義-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--defaultServletMapping-->
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置分析:
1. 非常熟悉的配置對不對,這就是一個非常常見的servlet配置。該servlet的name為default,其對應的servlet-class類為org.apache.catalina.servlets.DefaultServlet。
2. 對應的init-param標籤中兩個初始化引數,一個是debug,這個引數設定了debug的級別。一個是listings引數,該引數的作用是當對應URL並沒有對應一個資源時,是否要顯示資源目錄,該引數配置為了false,也就是不顯示。
3. load-on-startup為1是說明當應用啟動時就在載入該servlet,預設的情況下是使用者第一次訪問該servlet方法時才會例項化並載入servlet。
4. DefaultServlet的servlet-mapping配置的為/,很多帖子或者書籍上都說/的URL對映符會對映除了*.xxx類帶字尾的地址URL,事實上/對映可以處理所有的請求,一般只有defaultServlet會配置為/,如果自定義的Servlet也配置為/,那麼將會覆蓋defaultservlet的配置。
二、JspServlet的作用
同理,在Tomcat Server中執行的web application,對於類似於.jsp的java動態服務頁同樣不需要我們自己處理。我們可以直接通過一個URL例如/index.jsp來訪問到該頁面,這是因為在conf/web.xml中有一個JspServlet來處理這類請求。
<!--在conf/web.xml中有定義-->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
...............
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
配置分析
1. 文件解釋: The JSP page compiler and execution servlet, which is the mechanism ,used by Tomcat to support JSP pages. Traditionally, this servlet ,is mapped to the URL pattern “*.jsp”. This servlet supports the,following initialization parameters (default values are in square brackets)。
2. 直接翻譯:JSP頁的編譯和執行Servlet, 是Tomcat支援JSP頁面的機制。另外,這個servlet被對映的URL模式為”*.jsp”。 同時也支援一些初始化引數。它們都具有一些預設值。具體解釋可以看conf/web.xml中的註釋。
三、DefaultServlet在實際開發中的應用。
JSP/Servlet架構的web專案
這類架構的專案無需顯示配置DefaultSerlvet,一般來說,jsp字尾請求會交給JspServlet,靜態資源請求圖片等會交給DefaultServlet處理。
SSM中DispatcherServlet的URL配置
”*.do,*.action等配置”,當servlet-mapping配置為*.do這類帶指定字尾的時候,靜態資原始檔依舊可以交給DefaultServlet處理。(*.do的DispatcherServlet不會攔截類似*.jsp,*.jpg的請求)
<!-- Spring MVC -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>SpringMVC</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
mapping為“/”的配置,當Dispatcher Servlet的mapping配置為/的時候,這時候會覆蓋DefaultServlet的配置(DispathcerServlet會更先匹配到),那麼對於.jpg,.png類似這種靜態資源就得不到處理(之前是defaultServlet)會處理,所以這類資源就會得到404錯誤。所以我們需要有額外的配置來解決這個問題。
繼續通過DefaultServlet來處理。我們在應用的web.xml中將常用的靜態資源URL對映到defaultServlet上。
<!--通過defaultServlet來處理jpg-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<!--通過DefaultServlet來處理png-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<!--通過defaultServlet來處理.js檔案-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<!--通過defaultServlet來處理.css檔案-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
通過Spring的<mvc:resource>來配置資源對映,將靜態資源的對映進行放行。
<!-- 放行靜態資源 -->
<!--放行js檔案-->
<mvc:resources location="/js/" mapping="/js/**"/> <!--放行css檔案-->
<mvc:resources location="/css/" mapping="/css/**"/>
<!--放行img類的資原始檔-->
<mvc:resources location="/images/" mapping="/images/**"/>
通過Spring MVC的<mvc:default-handler/>:通過這個標籤可以啟動Spring
MVC定義的一個類似於Tomcat的DefaultServlet的DefaultServletHttpRequestHandler類。
<mvc:default-servlet-handler />
相關文章
- 詳解Java 容器(第②篇)——容器中的設計模式Java設計模式
- 容器Docker詳解Docker
- docker容器dockerfile詳解Docker
- Spring容器——BeanFactory詳解SpringBean
- SpringBoot 中的 Servlet Web 容器Spring BootServletWeb
- 詳解Java 容器(完結篇)——詳解容器的設計模式、List、Map、併發容器Java設計模式
- Tomcat詳解系列(1) - 如何設計一個簡單的web容器TomcatWeb
- C++ stl容器詳解C++
- Golang中的強大Web框架Fiber詳解GolangWeb框架
- 詳解Java 容器(第⑤篇)——容器原始碼分析 - 併發容器Java原始碼
- 詳解Java 容器(第③篇)——容器原始碼分析 - ListJava原始碼
- 詳解Java 容器(第④篇)——容器原始碼分析 - MapJava原始碼
- 詳解 Docker 容器網路配置Docker
- SpringBoot使用外部Web容器的解決方案Spring BootWeb
- JSON Web Token 使用詳解JSONWeb
- web前端中涉及的迴流和重繪詳解!Web前端
- java刷題時常用容器詳解Java
- 詳解Java 容器(第①篇)——概覽Java
- web前端技術Mongoose詳解Web前端Go
- Java Web(5)-Servlet詳解(下)JavaWebServlet
- Java Web(5)-Servlet詳解(上)JavaWebServlet
- Web Components 系列(五)—— 詳解 SlotsWeb
- Web除錯技術詳解Web除錯
- 自動化整合:Kubernetes容器引擎詳解
- Flutter 基礎Widgets之容器Container詳解FlutterAI
- Java Web中的request,response,重定位與轉發的詳解JavaWeb
- Django web框架-----url path name詳解DjangoWeb框架
- 詳解五種Docker容器的網路模式Docker模式
- 詳解華為雲基因容器服務GCSGC
- 詳解Docker容器視覺化監控中心搭建Docker視覺化
- 詳解 Flink 容器化環境下的 OOM KilledOOM
- Go Web 服務框架實現詳解GoWeb框架
- 詳解Nginx如何配置Web伺服器NginxWeb伺服器
- WEB應用是如何運用Spring的?#①Spring的IOC容器如何在WEB中建立?WebSpring
- 併發容器的原理,七大併發容器詳解、及使用場景
- 容器技術架構、網路和生態詳解架構
- 併發容器之ArrayBlockingQueue和LinkedBlockingQueue實現原理詳解BloC
- Go For Web:Golang http 包詳解(原始碼剖析)WebGolangHTTP原始碼