1-Servlet的路徑配置
課程介紹:
通過對 Servlet 的調用流程學習,我們知道 web.xml 文件的配置是為了保護servlet。其實服務器應該調用哪個 servlet 進行請求的處理, 在瀏覽器的請求地址中寫的很清楚。
一、注解配置:
1、精確匹配(路徑要一樣),一般作用於站點獨特的幾個路徑,首頁、登錄、注冊等等
@WebServlet("/hello") |
2、路徑匹配,一般用於產品頁,新聞頁面,百科頁面一般用於大量相類似的頁面
@WebServlet("/product/*") |
3、擴展名匹配
@WebServlet("*.json")
|
匹配多個路徑:
@WebServlet(urlPatterns= {"/morepath","*.do","/more/*"})
|
二、Servlet的web.xml 配置:
Web.xml 配置的作用:保護Servlet。
配置方式一:精確匹配
Web.xml 配置的作用:保護Servlet。
配置方式一:精確匹配
<!-- 配置方式一 --> <servlet> <servlet-name>my3</servlet-name> <servlet- class>com.bjsxt.servlet.MyServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>my3</servlet-name> <url-pattern>/my3</url-pattern> </servlet-mapping>
配置方式二:路徑匹配
<!-- 配置方式一 --> <servlet> <servlet-name>my3</servlet-name> <servlet- class>com.bjsxt.servlet.MyServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>my3</servlet-name> <url-pattern>/my3</url-pattern> </servlet-mapping>
配置方式三:擴展名匹配
<servlet> <servlet-name>my3</servlet-name> <servlet- class>com.bjsxt.servlet.MyServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>my3</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
加載時機:
服務器啟動的時候會將 webapps 中部署好的項目統一進行加載,並完成對每個項目的 web.xml 文件的加載。
注意:
一個 Servlet 可有擁有多個 url-pattern 配置,但是一個url-pattern 配置只能對應一個Servlet
路徑和擴展名匹配無法同時設置,比如下面的三個<url-pattern>都是非法的,如果設置,啟動tomcat服務器會報錯。
<url-pattern>/kata/*.jsp</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>he*.jsp</url-pattern>
另外注意:<url-pattern>/aa/*/bb</url-pattern>
這個是精確匹配,url必須是 /aa/*/bb,這里的*不是通配的含義
優先順序
當一個url與多個servlet的匹配規則可以匹配時,則按照 “ 精確路徑 > 最長路徑>擴展名”這樣的優先級匹配到對應的servlet。舉例如下:
例1: servletA 的url-pattern為 /test, servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,這個時候容器就會先進行精確路徑匹配,發現/test正好被servletA精確匹配,那么就去調用servletA,不會去管servletB。 例2: servletA的url-pattern為/test/*, servletB的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這里的servletB。 例3: 比如 servletA的url-pattern:*.action , servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test.action,這個時候容器就會優先進行路徑匹配,而不是去匹配擴展名,這樣就去調用servletB。
頁面亂碼:解決方法
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UFT-8");