1. введение
Spring MVC-это традиционное приложение, построенное с использованием шаблона переднего контроллера. DispatcherServlet , который выступает в качестве переднего контроллера, отвечает за маршрутизацию и обработку запросов.
Как и в случае с любым веб-приложением или веб-сайтом, Spring MVC возвращает код ответа HTTP 404, когда запрошенный ресурс не может быть найден. В этом уроке мы рассмотрим общие причины 404 ошибок в Spring MVC .
2. Возможные причины ответа 404
2.1. Неправильный URI
Допустим, у нас есть GreetingController , который сопоставляется с /приветствием и отображает greeting.jsp :
@Controller public class GreetingController { @RequestMapping(value = "/greeting", method = RequestMethod.GET) public String get(ModelMap model) { model.addAttribute("message", "Hello, World!"); return "greeting"; } }
Соответствующее представление отображает значение переменной message :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>Greeting ${message}
Как и ожидалось, запрос GET на /приветствие работает:
curl http://localhost:8080/greeting
Мы увидим HTML-страницу с сообщением “Привет, мир”:
Greeting Hello, World!
Одной из наиболее распространенных причин появления 404 является использование неправильного URI. Например, было бы неправильно делать запрос GET на /приветствия вместо /приветствия :
curl http://localhost:8080/greetings
В таком случае мы увидим предупреждающее сообщение в журналах сервера:
[http-nio-8080-exec-6] WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/greetings] in DispatcherServlet with name 'mvc'
И клиент увидит страницу с ошибкой:
Home Http Error Code : 404. Resource not found
Чтобы избежать этого, нам нужно убедиться, что мы правильно ввели URI.
2.2. Неправильное отображение сервлетов
Как объяснялось ранее, DispatcherServlet является передним контроллером в Spring MVC. Следовательно, как и в стандартном приложении на основе сервлета, нам нужно создать отображение для сервлета с помощью web.xml файл.
Мы определяем сервлет внутри тега servlet и сопоставляем его с URI внутри тега servlet-mapping . Нам нужно убедиться, что значение url-pattern является правильным, потому что довольно часто можно увидеть предложения , где сервлет сопоставлен с “/*” — обратите внимание на конечную звездочку :
mvc org.springframework.web.servlet.DispatcherServlet 1 mvc /*
Теперь, если мы запросим /приветствие , мы увидим предупреждение в журналах сервера:
curl http://localhost:8080/greeting
WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/WEB-INF/view/greeting.jsp] in DispatcherServlet with name 'mvc'
На этот раз ошибка гласит, что greeting.jsp не найден, и пользователь видит пустую страницу.
Чтобы исправить ошибку, нам нужно сопоставить DispatcherServlet вместо “/” (без конечной звездочки):
mvc /
После исправления отображения все должно работать правильно. Запрос /приветствие теперь отображается сообщение “Привет, мир!”:
curl http://localhost:8080/greeting
Greeting Hello, World!
Причина проблемы заключается в том, что если мы сопоставляем DispatcherServlet с/* , , то мы сообщаем приложению, что каждый запрос, поступающий в наше приложение, должен обслуживаться DispatcherServlet . Однако это неправильный подход, потому что DispatcherServlet не способен на это. Вместо этого Spring MVC ожидает, что реализация ViewResolver будет обслуживать представления, такие как файлы JSP.
3. Заключение
В этой краткой статье мы объяснили, как отлаживать 404 ошибки в Spring MVC. Мы рассмотрели две наиболее распространенные причины получения ответа 404 от нашего весеннего приложения. Во – первых, при отправке запроса использовался неверный URL-адрес. Вторым было сопоставление DispatcherServlet с неправильным url-шаблоном в web.xml .
Как всегда, полную реализацию этого учебника можно найти на Github .