|
|
@ -54,6 +54,8 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { |
|
|
|
|
|
|
|
|
|
|
|
private Object rootHandler; |
|
|
|
private Object rootHandler; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean useTrailingSlashMatch = false; |
|
|
|
|
|
|
|
|
|
|
|
private boolean lazyInitHandlers = false; |
|
|
|
private boolean lazyInitHandlers = false; |
|
|
|
|
|
|
|
|
|
|
|
private final Map<String, Object> handlerMap = new LinkedHashMap<String, Object>(); |
|
|
|
private final Map<String, Object> handlerMap = new LinkedHashMap<String, Object>(); |
|
|
@ -76,6 +78,22 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { |
|
|
|
return this.rootHandler; |
|
|
|
return this.rootHandler; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Whether to match to URLs irrespective of the presence of a trailing slash. |
|
|
|
|
|
|
|
* If enabled a URL pattern such as "/users" also matches to "/users/". |
|
|
|
|
|
|
|
* <p>The default value is {@code false}. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void setUseTrailingSlashMatch(boolean useTrailingSlashMatch) { |
|
|
|
|
|
|
|
this.useTrailingSlashMatch = useTrailingSlashMatch; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Whether to match to URLs irrespective of the presence of a trailing slash. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public boolean useTrailingSlashMatch() { |
|
|
|
|
|
|
|
return this.useTrailingSlashMatch; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Set whether to lazily initialize handlers. Only applicable to |
|
|
|
* Set whether to lazily initialize handlers. Only applicable to |
|
|
|
* singleton handlers, as prototypes are always lazily initialized. |
|
|
|
* singleton handlers, as prototypes are always lazily initialized. |
|
|
@ -159,6 +177,11 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { |
|
|
|
if (getPathMatcher().match(registeredPattern, urlPath)) { |
|
|
|
if (getPathMatcher().match(registeredPattern, urlPath)) { |
|
|
|
matchingPatterns.add(registeredPattern); |
|
|
|
matchingPatterns.add(registeredPattern); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (useTrailingSlashMatch()) { |
|
|
|
|
|
|
|
if (!registeredPattern.endsWith("/") && getPathMatcher().match(registeredPattern + "/", urlPath)) { |
|
|
|
|
|
|
|
matchingPatterns.add(registeredPattern +"/"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
String bestPatternMatch = null; |
|
|
|
String bestPatternMatch = null; |
|
|
|
Comparator<String> patternComparator = getPathMatcher().getPatternComparator(urlPath); |
|
|
|
Comparator<String> patternComparator = getPathMatcher().getPatternComparator(urlPath); |
|
|
@ -171,6 +194,10 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { |
|
|
|
} |
|
|
|
} |
|
|
|
if (bestPatternMatch != null) { |
|
|
|
if (bestPatternMatch != null) { |
|
|
|
handler = this.handlerMap.get(bestPatternMatch); |
|
|
|
handler = this.handlerMap.get(bestPatternMatch); |
|
|
|
|
|
|
|
if (handler == null) { |
|
|
|
|
|
|
|
Assert.isTrue(bestPatternMatch.endsWith("/")); |
|
|
|
|
|
|
|
handler = this.handlerMap.get(bestPatternMatch.substring(0, bestPatternMatch.length() - 1)); |
|
|
|
|
|
|
|
} |
|
|
|
// Bean name or resolved handler?
|
|
|
|
// Bean name or resolved handler?
|
|
|
|
if (handler instanceof String) { |
|
|
|
if (handler instanceof String) { |
|
|
|
String handlerName = (String) handler; |
|
|
|
String handlerName = (String) handler; |
|
|
|