URI 配對模式

Servlet URI 匹配規則

URI Pattern

這篇來講講我們常常在 @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 權重規則其實在各個不同的地方都看得到,能把這個基礎掌握起來對之後會滿有幫助的!!