В сопоставлении сервлета в Spring MVC, как мне сопоставить корень каталога шаблона url?

<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 (чего я не хочу).

Ответ 1

Евгений является правильным, но если ваш DispatcherServlet перехватывает сервлет по умолчанию, вы должны добавить его в свой web.xml:

<welcome-file-list>
    <welcome-file>/</welcome-file>
</welcome-file-list>

Ответ 2

моя настройка обычно выглядит так:

<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 будут обслуживаться, не заставляя вас писать дополнительный контроллер.

Ответ 3

Прежде всего, разница между сервлет-диспетчером отображения с "/" и "/*" . Есть разница!

При сопоставлении с "/*" все 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

Ответ 4

Не трогайте файл web.xml, устанавливая карту в путь к файлу приветствия по умолчанию.

@RequestMapping("/index.html")

Ответ 5

В моем случае каждый URL работал , за исключением корневого "/" url.
Проблема заключалась в том, что я не удалял файл index.htm внутри корневой папки webapp моих проектов.