1. 程式人生 > >【12】Servlet中的預設對映問題

【12】Servlet中的預設對映問題

問題描述

Servlet中配置了預設路徑後,原先在WebRoot中的靜態頁面無法通過URL訪問了,為什麼?

嘗試

已經做的努力:

  • 將檔案字尾改為.jsp後可以正常訪問
  • 將預設對映刪除後可以正常訪問
  • 原有的index.jsp可以正常訪問

撥開迷霧

tomcat在/conf/web.xml中定義了”/”到DafaultServlet的對映,在DafaultServlet中有renderHTML和renderXML方法來表示或者渲染html和xml檔案


<servlet>
        <servlet-name>default</servlet-name
>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

並定義了”*.jsp”和”*.jspx”到JspServlet的對映,在JspServlet中處理jsp和jspx檔案


<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
</servlet-mapping> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jspx</url-pattern> </servlet-mapping>

如果在自己的web工程中定義了預設對映<url-pattern>/</url-pattern>,會使得tomcat中的預設對映失效,而自己定義的Servlet通常不具備處理html檔案的能力,所以無法渲染html頁面。那麼對於jsp檔案呢?這就得說到Servlet匹配過程了。

Servlet的匹配過程

  1. 嚴格匹配優於帶*的匹配
  2. 最長pattern優於其他pattern
  3. 路徑匹配優於檔案型別匹配
  4. pattern/總是匹配沒有其他pattern匹配的request

可見,由於tomcat中/conf/web.xml中定義了*.jsp的對映,根據規則4,是不會被預設對映捕獲的。所以jsp檔案的訪問正常。

解決方案

那麼問題來了,該怎麼解決這種情況?

  1. 用jsp代替html;
  2. 工程不使用預設對映;
  3. 工程中的預設Servlet增加處理html的方法。