Я публикую это как ответ, потому что он слишком длинный, но, вероятно, это не ответ.
http://localhost:8080/webapp/servlet-mapping-url/controller-mapping/method-mapping
если метод вашего контроллера, который обрабатывает запрос, не возвращает строку имени представления или объект представления или запись непосредственно в выходной поток, диспетчер Spring должен разрешить имя представления в /WEB-INF/jsp/controller-mapping/method-mapping.jsp
Это означает, что jsp должен находиться в папке с именем /WEB-INF/jsp/controller-mapping/
. Однако, если имя представления или объект представления возвращается методом контроллера, диспетчер Spring будет использовать его вместо этого.
Есть еще много возможных комбинаций картирования, но это наиболее распространенная. Если бы вы могли показать свой класс контроллера, это будет проще.
Обновление
Если вы используете DefaultAnnotationHandlerMapping
, вы всегда должны отмечать свой класс @RequestMapping(value = "/mapping-string")
. В противном случае пружинный диспетчер попытается забрать его, когда больше ничего не найдено.
Поскольку контроллер сопоставлен, вам придется изменить отображение метода на value = {"", "/"}
Для имени возвращаемого вида вам не нужно ставить .jsp
.
Если имя возвращаемого вида - home
, диспетчер пружин разрешит /WEB-INF/jsp/home.jsp
Если имя возвращаемого вида - path/home
, диспетчер пружин разрешит /WEB-INF/jsp/path/home.jsp
P.S. Вы использовали слово forwardPath, но на самом деле это не форвард. Это просто имя вида.
@Controller
@RequestMapping(value = "/sitemap")
public class SiteMapController {
@RequestMapping(value = {"", "/"}, method = RequestMethod.GET)
public String sitemap (HttpServletRequest request, HttpServletResponse response) {
...
if (results == null || results.size() == 0) {
forwardPath = "home";
}
else if (results.size() == 1) {
forwardPath = "product";
}
else {
forwardPath = "category";
}
...
return forwardPath;
}
}