URI 配對模式
Servlet URI 匹配規則
這篇來講講我們常常在 @WebServlet 或 @WebFilter 中使用的 urlPatterns
有一下這幾個項目
- 路徑對應 ( Path mapping )
- 延伸對應 ( Extension mapping )
- 環境根目錄 ( Context root )
- 預設 Servlet
- 嚴格匹配 (Exact match)
假設一下我們的 ContentPath 都是 http://localhost:3000/uri-mapping
路徑對應 ( Path mapping )
開頭是 "/" 但是以 "/*" 作為結尾的 URI 模式
@WebServlet(
urlPatterns = "/path/*"
)
public class PathMapping extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Path Mapping");
}
}
那訪問 /path/hello 或 /path/hello.html 都會匹配到這個 URI 規則
延伸對應 ( Extension mapping )
這個我們可以想像成副檔名對應,對應的是 "*." 開頭
@WebServlet(
urlPatterns = "*.test"
)
public class ExtensionMapping extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Extension Mapping");
}
}
訪問 /hello.test 或 /test.test 都會匹配到這個 URI 規則
環境根目錄 ( Context root )
在 urlPatterns 中是 "" 空字串的要求,也就是 "/" 的請求
@WebServlet(
urlPatterns = ""
)
public class ContextRoot extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Context Root");
}
}
訪問 / 會匹配到這個 URI 規則
@WebServlet(
urlPatterns = "/"
)
public class DefaultServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Default Servlet");
}
}
在上面 URI 都有設定的情況下,我們訪問不管是 /123 還是 /456 甚至是 /test/123 都會匹配到這個 URI 規則
嚴格匹配 (Exact match)
顧名思義,他就是最嚴格的,也就是完全的指定 URI 匹配
@WebServlet(
urlPatterns = "/exact-match"
)
public class ExactMatch extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Exact Match");
}
}
這樣定義的話,我們就只有 /exact-match 會匹配到這個規則了!
記得!URI 匹配規則的優先級是「越嚴格 權重越重」
例如我們現在有 "/path/*" 規則,這是 路徑對應 ( Path mapping ) 規則 還有一個 "/path/test.html",這是一個 嚴格匹配 (Exact match) 規則
這時候匹配到的會是 "/path/test.html" 規則 而不會輪到 "/path/*" 這個規則
類似這樣的 URI 權重規則其實在各個不同的地方都看得到,能把這個基礎掌握起來對之後會滿有幫助的!!