Ответ 1
Евгений является правильным, но если ваш DispatcherServlet перехватывает сервлет по умолчанию, вы должны добавить его в свой web.xml:
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
<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 (чего я не хочу).
Евгений является правильным, но если ваш DispatcherServlet перехватывает сервлет по умолчанию, вы должны добавить его в свой web.xml:
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
моя настройка обычно выглядит так:
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
где я предполагаю, что вы хотите одинаково обрабатывать /test
и /test/
:
@Controller
public class MyController {
@RequestMapping("/test")
public String test() {
return "redirect:/welcome";
}
@RequestMapping("/test/")
public String test() {
return "redirect:/welcome";
}
@RequestMapping("/welcome")
public void test(ModelMap model) {
// do your stuff
}
}
настройка, подобная этой, приведет к тому, что DispatcherServlet
обработает запросы для файлов *.css
и *.js
, что нежелательно в большинстве случаев. Я думаю, что это проблема, которую описывает Бхавик. Для этих ресурсов вы можете использовать ResourceController следующим образом:
<mvc:resources mapping="/css/**" location="/resources/css/" />
<mvc:resources mapping="/js/**" location="/resources/js/" />
файлы из /resources/css
и /resources/js
будут обслуживаться, не заставляя вас писать дополнительный контроллер.
Прежде всего, разница между сервлет-диспетчером отображения с "/" и "/*" . Есть разница!
При сопоставлении с "/*" все URL-запросы (включая что-то вроде этого "/WEB-INF/jsp/.../index.jsp" ) отображаются на сервлет диспетчера.
Во-вторых, при использовании Spring + Tiles и возвращении некоторого JSP в определении вашей плитки, он рассматривается как внутренний запрос вперед и обрабатывается тем же сервлетом, что и исходный запрос. В моем примере я вызываю корневой URL "/" , который правильно пойман методом home(), а затем перенаправлен на "index.jsp" с помощью Tiles, который снова обрабатывается диспетчером Servlet. Очевидно, диспетчерский сервлет не может обрабатывать "index.jsp", потому что для него нет контроллера.
Да, это уродливо, но похоже, что так оно и работает.
Итак, единственное решение, которое я нашел до сих пор: изменить "/*" на "/" в web.xml. Таким образом, JSPs обрабатываются должным образом сервлетом Tomcat jsp, я думаю, а не диспетчерским сервлетом. К сожалению, это исправление приведет к расторжению отправки URL-адреса ROOT с помощью Spring, поэтому вам нужно оставить идею использования URL-адреса ROOT + Tiles на данный момент.
Обратите внимание, что добавление явного отображения сервлета ".jsp → Tomcat jsp в web.xml не помогает при использовании" /* ", и это отстой.
Проблема еще не решена.
Также это проблема в Spring MVC 3.0
Не трогайте файл web.xml, устанавливая карту в путь к файлу приветствия по умолчанию.
@RequestMapping("/index.html")
В моем случае каждый URL работал , за исключением корневого "/" url.
Проблема заключалась в том, что я не удалял файл index.htm
внутри корневой папки webapp моих проектов.