<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
Если я нажму /test/page, это будет работать. Однако нажатие /test или /test/ не будет работать. Я использую Spring MVC, и мое сопоставление запросов выглядит следующим образом:
@RequestMapping(value = {"","/"})
EDIT:
Я выполняю проверку с помощью независимого проекта, но это выглядит как ошибка с Spring UrlPathHelper. Следующий метод возвращает неверный путь, когда есть как контекст, так и путь сервлета, и вы попадаете в сервлет без конечной косой черты.
public String getPathWithinApplication(HttpServletRequest request) {
String contextPath = getContextPath(request);
String requestUri = getRequestUri(request);
if (StringUtils.startsWithIgnoreCase(requestUri, contextPath)) {
// Normal case: URI contains context path.
String path = requestUri.substring(contextPath.length());
return (StringUtils.hasText(path) ? path : "/");
}
else {
// Special case: rather unusual.
return requestUri;
}
}
Как пример, скажем, у меня есть контекст "admin" и следующего сервлет-отображения:
<servlet-mapping>
<servlet-name>usersServlet</servlet-name>
<url-pattern>/users/*</url-pattern>
</servlet-mapping>
Теперь у меня есть сопоставление запросов в одном из моих контроллеров, например:
@RequestMapping(value = {"","/"})
Если я удалю /admin/users, это не сработает. Однако, если я нажму /admin/users/, он будет работать. Теперь, если я изменю свое сопоставление запросов на следующее, они оба будут работать:
@RequestMapping(value = {"/users","/"})
Однако теперь будет работать URL /admin/users/users (чего я не хочу).