【12】Servlet中的預設對映問題
阿新 • • 發佈:2019-02-01
問題描述
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的匹配過程
- 嚴格匹配優於帶*的匹配
- 最長pattern優於其他pattern
- 路徑匹配優於檔案型別匹配
- pattern/總是匹配沒有其他pattern匹配的request
可見,由於tomcat中/conf/web.xml中定義了*.jsp的對映,根據規則4,是不會被預設對映捕獲的。所以jsp檔案的訪問正常。
解決方案
那麼問題來了,該怎麼解決這種情況?
- 用jsp代替html;
- 工程不使用預設對映;
- 工程中的預設Servlet增加處理html的方法。